2010-02-08 53 views
35

Tôi cần sử dụng một số thành phần WPF trong thử nghiệm đơn vị NUnit. Tôi chạy thử nghiệm qua ReSharper, và nó không thành công với các lỗi sau khi sử dụng các đối tượng WPF:Sử dụng các thành phần WPF trong các thử nghiệm NUnit - cách sử dụng STA?

System.InvalidOperationException:

Các thread gọi phải STA, vì nhiều thành phần giao diện người dùng yêu cầu này.

Tôi đã đọc về sự cố này và có vẻ như chuỗi cần phải là STA, nhưng tôi chưa tìm ra cách thực hiện việc này. Điều gì kích hoạt sự cố là mã sau:

[Test] 
public void MyTest() 
{ 
    var textBox = new TextBox(); 
    textBox.Text = "Some text"; // <-- This causes the exception. 
} 
+1

Đây không phải là một thử nghiệm đơn vị. Ngoài ra, bạn có chắc chắn muốn thử nghiệm của mình dựa vào các thành phần WPF không? Giao diện người dùng phải được tách biệt khỏi logic ứng dụng vì các lý do như trên. – Finglas

+7

Vâng - Tôi biết rằng không có thử nghiệm thực tế ở đây và đây không phải là thử nghiệm đơn vị của tôi. Tuy nhiên - đây là mã đủ để hiển thị điểm. Ngoài ra - vấn đề liên quan đến thực tế rằng đây là một thử nghiệm đơn vị nNnit chạy qua ReSharper - vì vậy tôi cần phải giữ bối cảnh này cho câu hỏi. Điểm khác của bạn là hợp lệ mặc dù .. Tôi không muốn thử nghiệm đơn vị của tôi dựa vào các thành phần WPF, nhưng bây giờ điều này có vẻ là giải pháp tốt nhất. Sẽ xem nếu tôi có thể nhận được nó ra khỏi đó sau này .. – stiank81

+0

Nếu bạn muốn xem lý do tại sao tôi có giao diện người dùng trong logic ứng dụng xem câu hỏi khác của tôi: http://stackoverflow.com/questions/2220842/modifying-ui-from- lệnh-using-command-binding-in-wpf – stiank81

Trả lời

0

Bạn đã thử this?


... chỉ cần tạo một file app.config cho dll bạn đang cố gắng để kiểm tra, và thêm một số cài đặt thích hợp NUnit NUnit để buộc để tạo ra các environemnt thử nghiệm như STA thay vì MTA.

Đối với mục đích thuận tiện, đây là tập tin cấu hình bạn sẽ cần (hoặc thêm các phần này để tập tin cấu hình hiện tại của bạn):

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
     <sectionGroup name="NUnit"> 
      <section name="TestRunner" type="System.Configuration.NameValueSectionHandler"/> 
     </sectionGroup> 
    </configSections> 

    <NUnit> 
     <TestRunner> 
      <add key="ApartmentState" value="STA" /> 
     </TestRunner> 
    </NUnit> 
</configuration> 
+2

Thx! Chỉ cần tìm ra giải pháp tương tự, và nó hoạt động. Rõ ràng ReSharper sử dụng một phiên bản cũ hơn của nUnit, và do đó tôi không thể đơn giản sử dụng thuộc tính [RequiresSTA]. – stiank81

+2

FYI, '[RequiresSTA]' hoạt động tốt trong VS 2013 với ReSharper 9 – cod3monk3y

+0

Nếu một phiên bản cụ thể của ReSharper có vấn đề với RequiresSTA, thì tại sao không chỉ ReSharper bỏ qua cảnh báo đó? – bugged87

58

Bạn nên thêm RequiresSTA attribut đến lớp thử nghiệm của bạn.

[TestFixture, RequiresSTA] 
public class MyTestClass 
{ 
} 
+7

đây phải là câu trả lời ... –

+1

Điều này chỉ dành cho các phiên bản NUnit dưới 3.0. Nó đã lỗi thời> phiên bản 3. –

18

Với phiên bản gần đây hơn, các thuộc tính đã thay đổi:

[Apartment(ApartmentState.STA)] 
public class MyTestClass 
{} 
+5

Đây là câu trả lời hiện tại với> phiên bản 3 của NUnit. –

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