2015-08-12 19 views
8

Thông thường tôi viết bài kiểm tra đơn vị của tôi trong F # nhưLàm thế nào để nắm bắt đầu ra với XUnit 2.0 và thử nghiệm phong cách FSharp

open Swensen.Unquote 
open Xunit 

module MyTests = 

    [<Fact>] 
    let ``SomeFunction should return 10``() = 
     let a = SomeFunction() 
     test <@ a = 10 @> 


    [<Fact>] 
    let ``SomeOtherFunction should return 11``() = 
     let a = SomeFunction() 
     test <@ a = 11 @> 

Nếu tôi muốn để đăng nhập vào giao diện điều khiển từ xUnit (theo http://xunit.github.io/docs/capturing-output.html) người ta cần phải viết một hàm tạo mất ITestOutputHelper và sau đó sử dụng nó thay vì Console.WriteLine và gia đình.

using Xunit; 
using Xunit.Abstractions; 

public class MyTestClass 
{ 
    private readonly ITestOutputHelper output; 

    public MyTestClass(ITestOutputHelper output) 
    { 
     this.output = output; 
    } 

    [Fact] 
    public void MyTest() 
    { 
     var temp = "my class!"; 
     output.WriteLine("This is output from {0}", temp); 
    } 
} 

tuy nhiên mô-đun fsharp là các lớp tĩnh và thử nghiệm là phương pháp tĩnh. Không có hàm tạo nào để chèn trình trợ giúp đầu ra.

Có cách nào để có quyền truy cập vào trình trợ giúp đầu ra hiện tại cho thử nghiệm hiện tại hay không. Tôi biết tôi có thể viết lại các bài kiểm tra fsharp của mình thành các lớp không tĩnh nhưng điều đó là không mong muốn.

Sau khi xem nguồn XUnit.

https://github.com/xunit/xunit/blob/e64f566b75f93cd3cec27f950759d82832bfe44b/src/xunit.execution/Sdk/Frameworks/Runners/TestClassRunner.cs#L90

Tôi khá chắc chắn đây là một trường hợp bị bỏ qua. Không có sự trợ giúp của người trợ giúp vào các lớp tĩnh.

+1

Điều này có thể phù hợp với bạn không? http://stackoverflow.com/a/2139303/126014 Bạn không viết về động lực cho việc muốn nắm bắt đầu ra, vì vậy nó có thể không áp dụng, nhưng tôi nghĩ rằng tôi muốn trỏ đến tùy chọn đó, chỉ trong trường hợp. –

Trả lời

8

Nếu xUnit không có bất kỳ cơ chế thay thế nào để tiêm tham số, thì tôi đoán tùy chọn duy nhất là xác định các phép thử dưới dạng phương thức trong kiểu đối tượng F #. Tôi cũng thích các bài kiểm tra văn bản theo chức năng sử dụng let, nhưng loại đối tượng đơn giản sau đây không nhìn quá xấu:

open Swensen.Unquote 
open Xunit 
open Xunit.Abstractions 

type MyTests(output:ITestOutputHelper) = 

    [<Fact>] 
    member __.``SomeFunction should return 10``() = 
     let a = SomeFunction() 
     output.WriteLine("Some function returned {0}", a) 
     test <@ a = 10 @> 

Nó sẽ được tốt đẹp nếu xUnit hỗ trợ một số tùy chọn khác cho việc này - Tôi nghi ngờ rằng họ có thể mở cửa cho gợi ý, nếu nó là cái gì đó sẽ không quá khó xử (có thể sử dụng một tham số phương thức?)

Nhưng trừ khi xUnit thêm hỗ trợ cho một số phương pháp khác, tôi nghĩ bạn sẽ cần sử dụng đối tượng F #.

+0

Cảm ơn bạn Tomas, nó hoạt động hoàn hảo :) –

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