2011-06-03 30 views
13

Sau khi thực hiện cả hai trường hợp kiểm tra sau, thao tác COM được in trên bảng điều khiển. Tôi đang làm gì sai?ngoại lệ COM khi thoát với WPF

Nếu tôi chạy thử nghiệm đơn lẻ hoặc nếu tôi chạy cả hai kiểm tra cùng nhau, ngoại lệ được ghi vào bảng điều khiển chính xác một lần. Điều này khiến tôi nghi ngờ rằng có một số loại tài nguyên trên mỗi AppDomain mà tôi không dọn dẹp.

Tôi đã thử các thử nghiệm với NUnit và với MSTest, với cùng một hành vi trong cả hai môi trường. (Trên thực tế, tôi không chắc chắn nếu chạy cả hai bài thi trong kết quả MSTest trong một ngoại lệ hoặc hai bản in duy nhất.)

Ngoại lệ:

System.Runtime.InteropServices.InvalidComObjectException: COM object that has been separated from its underlying RCW cannot be used. 
at System.Windows.Input.TextServicesContext.StopTransitoryExtension() 
at System.Windows.Input.TextServicesContext.Uninitialize(Boolean appDomainShutdown) 
at System.Windows.Input.TextServicesContext.TextServicesContextShutDownListener.OnShutDown(Object target) 
at MS.Internal.ShutDownListener.HandleShutDown(Object sender, EventArgs e) 

mã kiểm tra:

using NUnit.Framework; 

namespace TaskdockSidebarTests.Client 
{ 
    [TestFixture, RequiresSTA] 
    public class ElementHostRCWError 
    { 
     [Test] 
     public void WinForms() 
     { 
      var form = new System.Windows.Forms.Form(); 
      var elementHost = new System.Windows.Forms.Integration.ElementHost(); 
      form.Controls.Add(elementHost); 

      // If the form is not shown, the exception is not printed. 
      form.Show(); 

      // These lines are optional. The exception is printed with or without 
      form.Close(); 
      form.Controls.Remove(elementHost); 
      elementHost.Dispose(); 
      form.Dispose(); 
     } 

     [Test] 
     public void WPF() 
     { 
      var window = new Window(); 

      // If the window is not shown, the exception is not printed. 
      window.Show(); 

      window.Close(); 
     } 
    } 
} 
+0

lẽ http://social.msdn.microsoft.com/forums/en-US/vststest/thread/e53fdc45-23f3-4aee-aad9-f63769f2c638/ giúp –

+0

Đáng buồn thay, tôi không thể sử dụng MTA, vì WPF yêu cầu STA. Tạo ra các hình thức và máy chủ yếu tố trong SetUp dường như không làm các trick, một trong hai. Argh. –

+0

Nếu tôi không nhầm, ngoại lệ này không gây ra lỗi không nhất thiết, phải không? Tôi đã gặp phải ngoại lệ tương tự trong khi unittesting điều khiển WPF của tôi, tôi đã chọn để bỏ qua nó ..;) – Bubblewrap

Trả lời

18

Nhìn lại mã của riêng tôi, dòng sau có thể giúp cho thử nghiệm WPF, ngay ở cuối.

Dispatcher.CurrentDispatcher.InvokeShutdown(); 
+0

Sweeeeet! Điều đó đã làm điều đó. Cảm ơn! Bây giờ tôi chỉ cần tìm ra cách để phù hợp với điều này vào kiến ​​trúc thử nghiệm của tôi. –

+0

Thất vọng, khi người điều phối bị ràng buộc vào một chủ đề (tức là, Dispatcher.CurrentDispatcher), không có người điều phối nào khác có thể được liên kết với chủ đề đó. Và khi điều phối đã bị tắt, nó không thể khởi động lại được. Vì vậy, trong khi điều này giải quyết vấn đề của tôi, tôi buồn bã không thể chỉ cần đặt một cuộc gọi đến InvokeShutdown() trong phương pháp TearDown lớp thử nghiệm cơ sở của tôi. –

+0

Hãy thử bắt đầu một chuỗi STA mới trong mỗi lần không liên quan, thực hiện kiểm tra trong chuỗi mới đó và đợi chuỗi đó kết thúc bằng Thread.Join(). – Bubblewrap

1

Bạn có thể 't đơn vị kiểm tra các lớp học WindowForm cả. Cả hai ứng dụng WinForms và các ứng dụng WPF đều có một lớp Application được sử dụng để khởi động hệ thống ống nước bên dưới (máy bơm thông báo và không có gì). Tôi đặt cược đó là chìa khóa để tránh ngoại lệ đó.

Bạn không làm điều đó ở đó và có thể không thực hiện được.

Mọi đề xuất để kiểm thử đơn vị tôi từng đọc là bạn cấu trúc lại để các lớp FormWindow không làm bất cứ điều gì bạn cần để kiểm tra đơn vị (như mẫu M-V-VM trong WPF). Có thể liên quan đến việc không thể hiển thị giao diện người dùng.

Có nhiều cách khác để kiểm tra giao diện người dùng. This answer thảo luận về giao diện người dùng kiểm tra đơn vị.

+3

Trên thực tế, các thử nghiệm chạy tốt - tôi chỉ kết thúc với rất nhiều crap trong các tập tin đăng nhập của tôi. Về kiểm tra giao diện người dùng so với thử nghiệm logic kinh doanh trực tiếp - Tôi tin rằng tôi càng tiến hành thử nghiệm điều thực tế mà người dùng giao dịch, thì tôi sẽ ngủ ngon hơn vào ban đêm. –

+0

+1 cho cả Joel và Patrick, bởi vì tôi nghĩ cả hai đều đúng. Trong khi tôi đồng ý với Joel rằng thiết kế nên giống như thế - bạn không thể tranh luận rằng đôi khi bạn chỉ phải tự động hóa một vài điều khiển/cửa sổ chỉ vì một số mã cũ/mong manh/không phải mã cần nó. – quetzalcoatl

Các vấn đề liên quan