2011-09-14 12 views
5

मैं एफ # के लिए नौसिखिया हूं और मैं एफपीआरसीईसी के साथ खेल रहा हूं। मैं एएसटी उत्पन्न करने के लिए एफपीआरसीईसी का उपयोग करूंगा। मैं सही संचालन सुनिश्चित करने के लिए पार्सर के विभिन्न हिस्सों के आसपास कुछ परीक्षण लिखने के लिए FsUnit का उपयोग करना चाहता हूं।भेदभाव वाले यूनियनों की तुलना

मुझे वाक्यविन्यास के साथ कुछ परेशानी हो रही है (क्षमा करें, सटीक कोड काम पर है, मैं बाद में एक विशिष्ट उदाहरण पोस्ट कर सकता हूं) तो कैसे एक दो भेदभाव वाले यूनियनों की तुलना कर सकता है (एक अपेक्षित, दूसरा वास्तविक परिणाम)? क्या कोई FSUnit (या NUnit) का उपयोग करके एक छोटा कोड उदाहरण प्रदान कर सकता है, कृपया?

एक उदाहरण भेदभाव संघ (बहुत सरल)

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

(एफ # यूनियनों संरचनात्मक समानता, जिसका अर्थ है कि '=' ठीक करता है चीज, संपूर्ण संरचना/मूल्य की तुलना करना।) – Brian

उत्तर

6

, के बाद से के रूप में ब्रायन ने कहा, एफ # यूनियनों संरचनात्मक समानता है, यह जो भी इकाई परीक्षण रूपरेखा आप के शौकीन हैं का उपयोग कर आसान है।

FsUnit NUnit के शीर्ष पर निर्मित एक F # विशिष्ट लाइब्रेरी है। मेरी व्यक्तिगत पसंदीदा एफ # विशिष्ट इकाई परीक्षण लाइब्रेरी Unquote है,;), जो फ्रेमवर्क अज्ञेयवादी है, एनयूनीट, xUnit.net, MbUnit, या यहां तक ​​कि एफएसआई के भीतर भी बहुत अच्छी तरह से काम कर रही है। आप FsUnit के साथ तुलना में this तुलना में रुचि हो सकती है।

तो, आप NUnit + Unquote के साथ ऐसा कैसे करेंगे? यहाँ एक पूर्ण काम कर उदाहरण है:

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") @> 

फिर TestDriven.NET का उपयोग कर परीक्षण, उत्पादन इस प्रकार है के रूप में चल:

------ 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

धन्यवाद, मैं काम करने के लिए इसे आज़मा दूंगा। मुझे लगता है कि मुझे पता है कि मैं आपका उदाहरण देखने के बाद अब क्या गलत कर रहा था। मैं (वैरिएबल "VAR") का उपयोग कर रहा था, लेकिन मेरी अपेक्षा के अनुसार वैरिएबल ("VAR") का उपयोग करना चाहिए था ... जल्द ही उत्तर दिया जाएगा! –

+0

एक आकर्षण की तरह काम किया, धन्यवाद। मैं एक कठिन दिखने के लिए जा रहा हूं क्योंकि FsUnit बस मेरे लिए यहां काम नहीं कर रहा है ... –

+0

अनोखा महान है, इसे प्यार करता हूँ। धन्यवाद –

2

एक उदाहरण - आप प्रकार की जांच करना चाहते हैं लेकिन सामग्री

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

नोट यहाँ आप प्रत्येक के लिए एक अलग समारोह की जरूरत है कि नहीं करता है, तो भेदभाव संघ का तत्व

यदि आप समानता की तुलना करना चाहते हैं, तो आप इसे मानक तरीके से कर सकते हैं, जैसे

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

या

if result = Variable("hello") then stuff() 
संबंधित मुद्दे