2017-08-15 70 views
7

Tôi đang cố gắng để đạt được các hành vi sau đây với FsCheck: Tôi muốn tạo ra một máy phát điện sẽ tạo ra một thể hiện của loại MyUnion, với tất cả các lĩnh vực chuỗi là không -null/trống.Lực lượng FsCheck để tạo NonEmptyString cho phân biệt đối xử lĩnh vực loại chuỗi

type MyNestedUnion = 
    | X of string 
    | Y of int * string 

type MyUnion = 
    | A of int * int * string * string 
    | B of MyNestedUnion 

gõ 'thực' của tôi là lớn hơn nhiều/sâu hơn MyUnion, và FsCheck có khả năng để tạo ra một trường hợp mà không cần bất kỳ vấn đề, nhưng các lĩnh vực chuỗi trong các trường hợp công đoàn đôi khi trống rỗng. (Ví dụ: nó có thể tạo ra B (Y (123, "")))

Có thể có một số cách rõ ràng để kết hợp sốcủa FsCheck và hỗ trợ tạo các loại liên kết tùy ý mà tôi bị thiếu?

Bất kỳ mẹo/con trỏ nào đúng hướng được đánh giá cao.

Cảm ơn!

Trả lời

5

này đi ngược lại các hạt thử nghiệm dựa trên tài sản (trong đó bạn ngăn chặn một cách rõ ràng trường hợp thử nghiệm hiệu lực kể từ được tạo ra), nhưng bạn có thể cấp điện cho máy phát điện chuỗi không bị trống để được sử dụng cho tất cả các chuỗi:

type Alt = 
    static member NonEmptyString() : Arbitrary<string> = 
     Arb.Default.NonEmptyString() 
     |> Arb.convert 
      (fun (nes : NonEmptyString) -> nes.Get) 
      NonEmptyString.NonEmptyString 

Arb.register<Alt>() 

let g = Arb.generate<MyUnion> 

Gen.sample 1 10 g 

Lưu ý rằng bạn cần phải đăng ký lại trình tạo mặc định sau khi thử nghiệm vì ánh xạ là toàn cục.

Giải pháp chi tiết hơn sẽ là sử dụng trình tạo gốc mặc định và sau đó lọc các giá trị chứa chuỗi không hợp lệ (ví dụ: sử dụng ==>), nhưng bạn có thể thấy nó không khả thi đối với các loại lồng nhau đặc biệt.

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