2011-09-14 31 views
5

Tôi là người mới tham gia F # và tôi đang chơi với FParsec. Tôi sẽ sử dụng FParsec để tạo ra một AST. Tôi muốn sử dụng FsUnit để viết một số xét nghiệm xung quanh các phần khác nhau của trình phân tích cú pháp để đảm bảo hoạt động chính xác.So sánh các Công đoàn Phân biệt đối xử

Tôi gặp một chút rắc rối với cú pháp (xin lỗi, mã chính xác đang hoạt động, tôi có thể đăng một ví dụ cụ thể sau) để chính xác như thế nào có thể so sánh hai công đoàn bị phân biệt đối xử kết quả thực tế)? Ai đó có thể cung cấp một ví dụ mã nhỏ bằng cách sử dụng FsUnit (hoặc NUnit), xin vui lòng?

Một ví dụ phân biệt đối xử công đoàn (rất đơn giản)

type AST = 
    | Variable of string 
    | Class of string 
    | Number of int 
+3

(F # đoàn thể có sự bình đẳng về cơ cấu, điều đó có nghĩa rằng '=' không đúng sự điều, so sánh toàn bộ cấu trúc/giá trị.) – Brian

Trả lời

6

Kể từ khi Brian chỉ ra, F # đoàn thể có sự bình đẳng về cơ cấu, điều này rất dễ dàng sử dụng bất cứ khuôn khổ kiểm tra đơn vị bạn thích.

FsUnit là thư viện F # cụ thể được xây dựng trên NUnit. Thư viện thử nghiệm đơn vị F # cụ thể cá nhân của tôi là Unquote,;), là khung bất khả tri, hoạt động rất tốt với NUnit, xUnit.net, MbUnit, ... hoặc thậm chí trong FSI. Bạn có thể quan tâm đến việc so sánh this với FsUnit.

Vì vậy, bạn sẽ làm điều này với NUnit + Unquote như thế nào? Dưới đây là một ví dụ làm việc đầy đủ:

module UnitTests 

open NUnit.Framework 
open Swensen.Unquote 

type AST = 
    | Variable of string 
    | Class of string 
    | Number of int 

let mockFParsec_parseVariable input = Variable(input) 

[<Test>] 
let ``test variable parse, passing example``() = 
    test <@ mockFParsec_parseVariable "x" = Variable("x") @> 

[<Test>] 
let ``test variable parse, failing example``() = 
    test <@ mockFParsec_parseVariable "y" = Variable("x") @> 

Sau đó chạy các bài kiểm tra sử dụng TestDriven.NET, đầu ra là như sau:

------ Test started: Assembly: xxx.exe ------ 

Test 'UnitTests.test variable parse, failing example' failed: 

UnitTests.mockFParsec_parseVariable "y" = Variable("x") 
Variable "y" = Variable("x") 
false 
    C:\xxx\UnitTests.fs(19,0): at UnitTests.test variable parse, failing example() 

1 passed, 1 failed, 0 skipped, took 0.80 seconds (NUnit 2.5.10). 
+0

Cảm ơn bạn, tôi sẽ cố gắng khi tôi làm việc. Tôi nghĩ rằng tôi biết những gì tôi đã làm sai ngay bây giờ sau khi nhìn thấy ví dụ của bạn. Tôi đã sử dụng (Variable "VAR"), nhưng nên đã sử dụng Variable ("VAR") như dự kiến ​​của tôi ... sẽ đánh dấu như được trả lời trong thời gian ngắn hy vọng! –

+0

Làm việc như một say mê, cảm ơn. Tôi sẽ cho unquote một cái nhìn khó khăn bởi vì FsUnit chỉ không làm việc cho tôi ở đây ... –

+0

Unquote là tuyệt vời, yêu thương nó. Cảm ơn –

2

Một ví dụ - nếu bạn muốn kiểm tra các loại nhưng không phải là nội dung

let matched x= 
    match x with 
    |Variable(_) -> true 
    | _ -> false 

Lưu ý ở đây là bạn cần có một chức năng khác nhau cho mỗi yếu tố của công đoàn bị phân biệt

Nếu bạn muốn so sánh bình đẳng, bạn chỉ có thể thực hiện theo cách tiêu chuẩn, như

Assert.AreEqual(Variable("hello"),result) 

hoặc

if result = Variable("hello") then stuff() 
Các vấn đề liên quan