2011-11-16 10 views
5

एफ # में, मेरे पास कुछ फ़ील्ड के साथ एक रिकॉर्ड है:एफएस चेक में, गैर-नकारात्मक क्षेत्रों के साथ परीक्षण रिकॉर्ड कैसे उत्पन्न करें?

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

मैं इस रिकॉर्ड का उपयोग करने वाले कुछ गुणों का परीक्षण करने के लिए FsCheck का उपयोग कर रहा हूं। (एक contrved) उदाहरण के लिए,

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

myFunction के आंतरिक कार्यान्वयन प्रतिबंधों के कारण, मैं FSCheck परीक्षण केस बनाना चाहता हूं जिसमें प्रत्येक फ़ील्ड ए, बी, सी गैर- -निवेशिक फ्लोट्स।

मुझे संदेह है कि xxx28 myRecord के लिए जनरेटर बनाने की आवश्यकता है, लेकिन मुझे यह करने के तरीके के बारे में कोई उदाहरण नहीं मिला है।

क्या कोई मार्गदर्शन प्रदान कर सकता है?

+0

आप ध्यान से है [यह FsCheck विकी पेज] पढ़ें (http://fscheck.codeplex.com/wikipage?title=Test%20Data%20Generators&referringTitle=Home)? इसमें जनरेटर लिखने और पंजीकरण करने का एक उदाहरण है। – fmr

+2

@ एफएमआर - हां मैंने सभी एफएस चेक विकी पृष्ठों को ध्यान से पढ़ा है। जबकि एक साधारण जनरेटर लिखने के लिए कदम प्रदान किए जाते हैं (बहुत स्पष्ट रूप से IMHO नहीं), मैं यह निर्धारित करने में असमर्थ हूं कि रिकॉर्ड के लिए जनरेटर बनाने के लिए इसे कैसे विस्तारित किया जाए - इसलिए, SO सवाल। –

उत्तर

7

इस प्रयास करें:

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 

<!> एक इन्फ़िक्स map, अनुप्रयोगी शैली के लिए उपयोगी है। forAll

आप अपने जनरेटर रजिस्टर विश्व स्तर पर नहीं करना चाहते हैं, तो आप उपयोग कर सकते हैं:: यह एक बराबर जनरेटर है

Check.Quick (forAll Generators.arbMyRecord verify_this_property) 

एक व्यायाम के रूप में छोड़ दिया सिकुड़ते;)

+0

"" निर्माण का अर्थ क्या है? मैंने पहले यह नहीं देखा है। –

+2

@ डेविड एच: यह एक इंफिक्स 'मानचित्र' है, जो आवेदक शैली के लिए उपयोगी है। Http://bugsquash.blogspot.com/2010/12/zipping-with-applicative-functors-in-f.html –

+0

@ डेविड एच: कुछ और समझाया गया देखें। –

3

आप के बाद से FsCheck सभी अनुपयुक्त परीक्षण प्रविष्टियों को छोड़ने के लिए होगा 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) 

का उपयोग करके कस्टम जनरेटर बनाने परीक्षण की धीमी निष्पादन से बच सकते हैं हालांकि इस का परिणाम देगा (काफी हद तक?)।

संबंधित मुद्दे