2012-12-12 26 views
6

मैं एफ # में कुछ एनयूनीट परीक्षण लिखने की कोशिश कर रहा हूं और ThrowsConstraint पर फ़ंक्शन पास करने में समस्या आ रही है। एक आसुत (गैर) कामकाजी नमूना नीचे है।मैं एनआईएनआईटी फेंक प्रतिबंध पर फ़ंक्शन कैसे पास करूं?

open System.IO 
open NUnit.Framework 

[<TestFixture>] 
module Example = 

    [<Test>] 
    let foo() = 
     let f = fun() -> File.GetAttributes("non-existing.file") 
     Assert.That(f, Throws.TypeOf<FileNotFoundException>()) 

यह ठीक संकलित लेकिन मैं NUnit परीक्षण धावक से निम्नलिखित मिल:

FsTest.Tests.Example.foo: 
System.ArgumentException : The actual value must be a TestDelegate but was [email protected] 
Parameter name: actual 

जब मैं ExpectedException विशेषता का उपयोग कर समस्या को हल करने में सक्षम हूँ, मेरे सवाल का सही है क्या है इस स्थिति में एक एफ # समारोह का उपयोग करने का तरीका?

उत्तर

7

सभी आप अपने मूल टुकड़ा काम करने के लिए आदेश में क्या करने की जरूरत TestDelegate, जो unit -> unit है हस्ताक्षर अनुरूप करने के लिए f फिक्सिंग है। बस File.GetAttributes के रिटर्न मान त्यागें:

let f = fun() -> File.GetAttributes("non-existing.file") |> ignore 

एफ # संकलक अपने मूल कोड में barf नहीं किया क्योंकि सिर्फ एक और फिटिंग NUnit ओवरलोड Assert.That(actual: obj, expression: Constraints.IResolveConstraint) मौजूद है।

Assert.That के रूप में बहुत व्यापक उपयोग मैं उम्मीद अपवादों को अधिक विशिष्ट ज़ोर रूप है, का परीक्षण उदाहरण के लिए के लिए छड़ी होगी है:

[<Test>] 
let foo() = 
    Assert.Throws<FileNotFoundException> 
     (fun() -> File.GetAttributes("non-existing.file")|> ignore) 
    |> ignore 

जहां एफ # संकलक स्थिर अपने कार्य के गलत हस्ताक्षर स्थान में सक्षम होगा।

+0

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। –

+0

अच्छा, इसका अच्छा समाधान, क्योंकि एफ # (वीएस 2010) विशेषता दृष्टिकोण मेरे लिए काम नहीं कर रहा था (मैंने टेस्ट विधि को एक्सपेक्टेड अपवाद विशेषता के साथ चिह्नित करने का प्रयास किया और यह बिल्कुल काम नहीं किया) धन्यवाद! Unquote का उल्लेख करने के लिए – Roboblob

4

आईएमएचओ, आप न्यूटिट के शीर्ष पर Unquote का उपयोग करके स्वयं को कुछ दर्द बचा सकते हैं। फिर अपने दावे को कभी कभी अप्रत्याशित क्रम व्यवहार एफ # की तुलना में अभिव्यक्ति की सी # के रिश्तेदार की कमी की भरपाई के लिए तैयार कर रहे हैं के साथ जोर भार के की NUnit के बड़े सूट के रूप में सरल रूप में

[<Test>] 
let foo() = 
    raises<FileNotFoundException> <@ File.GetAttributes("non-existing.file") @> 

होगा।

ऑन-द-दूसरे हाथ, क्योंकि एफ # पहले से ही इस तरह के सुंदर ढंग से व्यक्त करने के दावे के लिए संरचनात्मक तुलना के रूप में सुविधाओं के साथ सुसज्जित है, गंदें शब्द बोलना सिर्फ तीन सरल अभिकथन ऑपरेटरों के साथ अपने मूल सुविधाओं का फायदा उठाने के लिए बनाया गया है: test, raises, और raisesWith

+0

+1। –

+0

यह काफी रोचक है क्योंकि मैंने पहली बार कोशिश की थी। दुर्भाग्य से एनयूनीट और अनकोट का संयोजन मेरे लिए काफी काम नहीं करता था इसलिए मैं न्यूटिट आवेषण में वापस आ गया। मैंने एनयूनीट के साथ इस मुद्दे को संक्षेप में बताया है और इसे एक अलग प्रश्न के रूप में पोस्ट किया है (http://stackoverflow.com/questions/13846561/missingmethodexception-when-using-unquote-asserts), इससे आपकी सहायता होगी तारीफ़ लें। –

+0

क्षमा करें @ सर्जबेलोव, यह दुर्भाग्यपूर्ण है! मैंने आपके नए प्रश्न पर एक टिप्पणी जोड़ा। मेरा मानना ​​है कि आपके पास जो मुद्दा है, वह अनक्वोट प्रति से नहीं है, बल्कि एनयूनीट परीक्षण धावक असेंबली लोडिंग/कॉन्फ़िगरेशन या उन पंक्तियों के साथ कुछ समस्या है। –

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

  • कोई संबंधित समस्या नहीं^_^