2013-08-14 23 views
11

Tôi đang cố gắng kiểm tra một phương thức async ném ngoại lệ cụ thể.FluentAssertions ShouldNotThrow không được nhận dạng cho một phương thức async/Func

Đối với điều đó, tôi đang sử dụng MSTEST và FluentAssertions 2.0.1.

Tôi đã kiểm tra này Discussion on Codeplex và xem làm thế nào nó hoạt động với các phương pháp async-ngoại lệ này khác một liên kết về FluentAssertions async tests:

Sau một thời gian cố gắng làm việc với 'sản xuất' mã của tôi, tôi đã tắt đến Fluentassertions giả lớp aync và mã kết quả của tôi là như thế này (đặt mã này bên trong một [TestClass]:

[TestMethod] 
public void TestThrowFromAsyncMethod() 
{ 
    var asyncObject = new AsyncClass(); 
    Action action =() => 
    { 
     Func<Task> asyncFunction = async() => 
     { 
      await asyncObject.ThrowAsync<ArgumentException>(); 
     }; 
     asyncFunction.ShouldNotThrow(); 
    }; 
} 


internal class AsyncClass 
{ 
    public async Task ThrowAsync<TException>() 
     where TException : Exception, new() 
    { 
     await Task.Factory.StartNew(() => 
     { 
      throw new TException(); 
     }); 
    } 

    public async Task SucceedAsync() 
    { 
     await Task.FromResult(0); 
    } 
} 

vấn đề là ShouldNotThrow là không hợp lệ:

ShouldNotThrow method is not recognised by the code. If I try to compile, it gives me this error: 'System.Func' does not contain a definition for 'ShouldNotThrow' and the best extension method overload 'FluentAssertions.AssertionExtensions.ShouldNotThrow(System.Action, string, params object[])' has some invalid arguments

Cảm ơn.


SOLUTION

2.0.1 phiên bản FA không hỗ trợ ShouldNotThrow chức năng này và nó sẽ được bao gồm trong phiên bản tiếp theo 2.1 (gần vào tuần tới).

Lưu ý: ShouldThrow đã được hỗ trợ trong phiên bản 2.0.1.

+1

Tôi không biết gì về FluentAssertions, nhưng ngoại lệ cho rằng ShouldNotThrow chỉ được định nghĩa cho 'Action' chứ không phải' Func'. –

+1

@KeithPayne Có nghĩa là FluentAsseritions có thể không hỗ trợ 'async'. – svick

+0

FluentAssertions hỗ trợ async, nếu bạn đọc liên kết ở trên (link), bạn có thể thấy nó. Và điều này cũng có thể giúp bạn: http://fluentassertions.codeplex.com/workitem/12148 – ferpega

Trả lời

15

Bạn không cần phải hành động bao gồm. Điều đó chỉ được sử dụng trong các bài kiểm tra đơn vị để xác minh rằng API đang ném ngoại lệ đúng. Điều này phải đủ:

[TestMethod] 
public void TestThrowFromAsyncMethod() 
{ 
    Func<Task> asyncFunction = async() => 
    { 
     await asyncObject.ThrowAsync<ArgumentException>(); 
    }; 

    asyncFunction.ShouldNotThrow(); 
} 

Thật không may ShoudlNotThrow() trên Func bị thiếu trong .NET 4.5. Tôi đã sửa lỗi này trong bản phát hành 2.1 (hiện đang dogfood).

+0

Khi đăng mã, vui lòng đánh dấu nó và nhấn nút '{}' (hoặc tự thụt lề mỗi dòng bằng bốn dấu cách nếu bạn cần bài tập). –

+0

@ DennisDoomen Tôi biết, tôi chỉ viết chính mã giống nhau những gì đang vượt qua các bài kiểm tra trong FA. Nhưng nếu khung của tôi đã là 4.5 tại sao FA cài đặt 4.0 .... với nuget? – ferpega

+0

@ DennisDoomen Ý tôi là, FA là phiên bản Thời gian chạy '4.0.30319' và nó đã nằm trên thư mục' net45' với đường dẫn đầy đủ này: '.... \ packages \ FluentAssertions.2.0.1 \ lib \ net45 \ FluentAssertions. dll'. Nhưng No 'ShouldNotThrow' có sẵn. – ferpega

1

Nếu bạn xem AssertionExtensions.cs class, bạn sẽ thấy rằng phương pháp mở rộng ShouldNotThrow trên Func chỉ được xác định cho mục tiêu biên dịch net45 hoặc winrt.

Kiểm tra này:

  1. dự án kiểm tra đơn vị của bạn là trên .net 4.5 hoặc WinRT
  2. Thư viện khẳng định tham chiếu là .net 4.5 một, nếu không cố gắng thay đổi thư viện FluentAssertions tham chiếu sang bên phải một.

Ngoài ra sau khi làm điều này, tôi nghĩ rằng bạn cần phải gọi phương thức hành động để thực hiện khẳng định, nếu không lambda bên trong sẽ không được gọi là:

[TestMethod] 
public void TestThrowFromAsyncMethod() 
{ 
    var asyncObject = new AsyncClass(); 
    Action action =() => 
    { 
     Func<Task> asyncFunction = async() => 
     { 
      await asyncObject.ThrowAsync<ArgumentException>(); 
     }; 
     asyncFunction.ShouldNotThrow(); 
    }; 

    action.ShouldNotThrow(); 
} 
+0

Mục tiêu là 4.5 nhưng versión thời gian chạy là: v4.0.30319.FluentAssertions được quản lý Nuget. – ferpega

+0

Vui lòng kiểm tra xem thư viện FluentAssertions được tham chiếu có xuất phát từ thư mục bên phải có tên "net45" bên trong thư mục gói nuget hay không. –

+0

Trong FA sắp phát hành 2.1, các phương thức mở rộng đó sẽ được hỗ trợ cho .NET 4.0 –