2009-07-23 36 views
20

Tôi đang sử dụng Xunit và NMock trên nền tảng .NET. Tôi đang thử nghiệm một mô hình trình bày trong đó một phương thức không đồng bộ. Phương thức này tạo một nhiệm vụ không đồng bộ và thực hiện nó để phương thức trả về ngay lập tức và trạng thái tôi cần kiểm tra chưa sẵn sàng.Có cách nào để kiểm tra đơn vị một phương pháp không đồng bộ không?

Tôi có thể đặt cờ khi hoàn thành mà không sửa đổi SUT nhưng điều đó có nghĩa là tôi sẽ phải kiểm tra cờ trong một vòng lặp trong khi ví dụ, với thời gian chờ.

Tùy chọn của tôi là gì?

+0

.NET không có condvars? – jrockway

+0

Bạn đang thử nghiệm khía cạnh nào? –

+0

Có những giải pháp phức tạp, nhưng nếu nó chỉ là một thử nghiệm, thì không có gì sai với tùy chọn vòng lặp/thời gian chờ/cờ. – Ray

Trả lời

19

Đối tượng của bạn có bất kỳ loại tín hiệu nào mà phương pháp không đồng bộ được hoàn tất, chẳng hạn như sự kiện không? Nếu đúng như vậy, bạn có thể sử dụng các phương pháp sau đây:

[Test] 
public void CanTestAsync() 
{ 
    MyObject instance = new MyObject() 
    AutoResetEvent waitHandle = new AutoResetEvent(false); 
    // create and attach event handler for the "Finished" event 
    EventHandler eventHandler = delegate(object sender, EventArgs e) 
    { 
     waitHandle.Set(); // signal that the finished event was raised 
    } 
    instance.AsyncMethodFinished += eventHandler; 

    // call the async method 
    instance.CallAsyncMethod(); 

    // Wait until the event handler is invoked 
    if (!waitHandle.WaitOne(5000, false)) 
    { 
     Assert.Fail("Test timed out."); 
    } 
    instance.AsyncMethodFinished -= eventHandler;  
    Assert.AreEqual("expected", instance.ValueToCheck); 
} 
+1

Bạn có thể đóng tay cầm chờ đợi khi thực hiện, vì nó sử dụng tài nguyên không được quản lý. Tôi tin rằng các tài nguyên này sẽ được dọn sạch tự động khi xử lý được thu thập, nhưng tôi thường muốn được rõ ràng khi các tài nguyên không được quản lý được sử dụng. –

4

Phương pháp ưa thích của tôi là giả lập và tiêm cơ chế luồng thực tế để kiểm tra nó không phải là không đồng bộ. Một số lần không thể thực hiện được (nếu luồng của phương thức là một phần của khuôn khổ, hoặc không nằm dưới sự kiểm soát của bạn).

Nếu bạn không thể kiểm soát quá trình tạo chuỗi, sau đó đợi chuỗi kết thúc theo một cách nào đó, hoặc là một vòng lặp while hoặc chỉ là thời gian chờ đợi, tuy nhiên chuỗi sẽ được thực hiện và không kiểm tra nếu trạng thái không có ở đó vì nó mất quá lâu.

2

kiểm tra bài viết của tôi trên đơn vị thử nghiệm các ứng dụng Silverlight

http://www.codeproject.com/KB/silverlight/Ag3DemoLOB.aspx

Có một ví dụ về đơn vị thử nghiệm một phương pháp mà các cuộc gọi một Dịch vụ WCF không đồng bộ ...

46

Chỉ nghĩ rằng bạn có thể muốn cập nhật về điều này vì câu trả lời số 1 thực sự đề xuất mẫu cũ hơn để giải quyết vấn đề này.

Trong .net 4.5 + xUnit 1.9 hoặc cao hơn, bạn có thể chỉ cần trả lại Tác vụ và tùy chọn sử dụng từ khóa async từ thử nghiệm của bạn để xunit đợi thử nghiệm hoàn tất không đồng bộ.

Xem bài viết này trên xUnit.net 1.9

[Fact] 
public async Task MyAsyncUnitTest() 
{  
    // ... setup code here ...  
    var result = await CallMyAsyncApi(...);  
    // ... assertions here ... 
} 
+0

Ahh ... nó luôn luôn tốt đẹp khi có một hỗ trợ bản địa trong khuôn khổ ... Tốt để biết, cảm ơn! –

+1

Lưu ý rằng điều quan trọng là trả lại một Tác vụ và không làm mất hiệu lực: http://stackoverflow.com/questions/23824660/xunit-async-test-not-working-properly –

+0

Để chính xác hơn, Kiểu trả về của phương thức phải là Tác vụ , bạn không thực sự cần 'return' nếu bạn đang sử dụng async/await. –

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