2011-11-16 21 views
5

Trong F #, tôi có một kỷ lục với một vài lĩnh vực:Trong FsCheck, cách tạo bản ghi thử nghiệm với các trường không âm?

type myRecord = { a:float; b:float; c:float } 

Tôi đang sử dụng FsCheck thử nghiệm một số thuộc tính mà sử dụng hồ sơ này. Đối (một giả tạo) Ví dụ,

let verify_this_property (r:myRecord) = myFunction(r) = (r.a * r.b)/r.c 

Do những hạn chế thực hiện nội bộ của myFunction, tôi muốn có FsCheck tạo trường hợp thử nghiệm, trong đó mỗi trường a, b, c được giới hạn không - phao nổi.

Tôi nghi ngờ điều này yêu cầu tạo trình tạo cho myRecord, nhưng tôi không thể tìm thấy bất kỳ ví dụ nào về cách thực hiện việc này.

Có ai cung cấp hướng dẫn không?

+0

Có bạn một cách cẩn thận đọc [trang Wiki FsCheck này] (http://fscheck.codeplex.com/wikipage?title=Test%20Data%20Generators&referringTitle=Home)? Nó có một ví dụ về cách viết và đăng ký một máy phát điện. – fmr

+2

@ fmr - Có, tôi đã đọc kỹ tất cả các trang Wiki của FsCheck. Trong khi các bước để viết một trình tạo đơn giản được cung cấp (không phải là IMHO rất rõ ràng), tôi không thể xác định cách mở rộng điều này để tạo một trình tạo bản ghi - do đó, câu hỏi SO. –

Trả lời

7

Hãy thử điều này:

type Generators = 
    static member arbMyRecord = 
     fun (a,b,c) -> { myRecord.a = a; b = b; c = c } 
     <!> (Arb.generate<float> |> Gen.suchThat ((<) 0.) |> Gen.three) 
     |> Arb.fromGen 

Arb.register<Generators>() |> ignore 
Check.Quick verify_this_property 

Các <!> là một trung tố map, hữu ích cho phong cách applicative. Đây là một máy phát điện tương đương:

Nếu bạn không muốn trên toàn cầu đăng ký phát, bạn có thể sử dụng forAll:

Check.Quick (forAll Generators.arbMyRecord verify_this_property) 

thu hẹp lại như một bài tập;)

+0

Ý nghĩa của cấu trúc "" là gì? Tôi chưa từng thấy điều đó trước đây. –

+2

@DavidH: đó là một “bản đồ” có sẵn, hữu ích cho phong cách ứng dụng. Xem http://bugsquash.blogspot.com/2010/12/zipping-with-applicative-functors-in-f.html –

+0

@DavidH: giải thích thêm một chút. –

3

Bạn có thể tránh việc tạo ra máy phát điện tùy chỉnh bằng cách sử dụng FsCheck conditional properties

let verify_this_property (r:myRecord) = 
    (r.a > 0.0 && r.b > 0.0 && r.c > 0.0) ==> lazy (myFunction r = (r.a * r.b) * r.c) 

Mặc dù điều này sẽ gây ra (đáng kể?) Thực hiện chậm hơn trong những bài kiểm tra từ FsCheck sẽ phải loại bỏ tất cả các mục kiểm tra không phù hợp.

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