2016-01-26 8 views
17

मैं परीक्षण चलाने के बाद किसी ऑब्जेक्ट की स्थिति की जांच करने का प्रयास कर रहा हूं। यह राज्य एक सेट में निहित है। क्या अपेक्षित राज्य को डीयूएनआईटीएक्स विशेषताओं का उपयोग करके टेस्ट केस में पास करना संभव है, ताकि मैं सभी अलग-अलग इनपुट के लिए एक ही परीक्षण का उपयोग कर सकूं?क्या मैं डुनिटेक्स में एक परीक्षण मामले में एक सेट पास कर सकता हूं?

मैंने सेट को निरंतर या सेट के रूप में पास करने का प्रयास किया, लेकिन मेरे टेस्ट दिनचर्या में यह हमेशा खाली सेट के रूप में आता है।

  • क्या यह सब कुछ विशेषताओं का उपयोग कर संभव है?
  • सेट्स समान होने पर आप कैसे परीक्षण करेंगे?

उदाहरण कोड:

type 
    TResult = (resOK,resWarn,resError); 
    TResultSet = set of TResult; 

const 
    cErrWarn : TResultSet = [resWarn]; 

type 
    [TestFixture] 
    TMyTest = class(TBaseTest) 
    [Test] 
    [TestCase('Demo1','InputA,[resWarn]')] // <-- tried as a set 
    [TestCase('Demo2','InputB,cErrWarn')] // <-- tried as a constant 

    procedure Test(Input:string; ExpectedResult: TResultSet); 
    end; 

procedure TMyTest.Test(Input:string; ExpectedResult: TResultSet); 
begin 
    // ExpectedResult is always the empty set [] 
    RunTests(MyObject(Input)); 
    Assert.AreEqual(ExpectedResult, MyObject.ResultSet); 
end; 

मैं भी सरणी के रूप में अपेक्षित परिणाम को परिभाषित करने की कोशिश की है, लेकिन फिर भी DUnitX अब और परीक्षण फोन नहीं करता है। शायद यह "बहुत अधिक"

procedure Test(Input:string; ExpectedResult: array of TResult); 

सबसे अच्छा मैं अब तक पहुंच सकता था निम्नलिखित दृष्टिकोण का उपयोग करना था। तीन तक का नमूना लें (यहां अपना पसंदीदा पूर्णांक डालें ...) अपेक्षित राज्यों और इन्हें अलग से जांचें। यह वास्तव में नहीं है कि मैं क्या उम्मीद कर रहा था, लेकिन यह चाल है।

procedure Test(Input:string; R1,R2,R3: TResult); 

सहायता की बहुत सराहना की जाती है। :)

+0

मैं तुम्हें था लगता होगा "IsTrue" का उपयोग करके जांच करनी है और फिर आइटम द्वारा तुलना आइटम बनाएं। –

+0

जिसका मूल रूप से मतलब है कि मुझे सभी वस्तुओं को अलग-अलग पैरामीटर के रूप में पास करना होगा, जो मैं टालना चाहता था। –

+0

मैं मूल रूप से उस से असहमत हूं। यूनिट परीक्षण का विचार यह है कि आप प्रत्येक परिदृश्य को अलग से जांचते हैं। इसका अर्थ यह है कि, आपके पास प्रति सेट मान के अनुसार एक टेस्ट विधि उचित होनी चाहिए: यदि एक परीक्षण में एक से अधिक मान की आवश्यकता होती है, तो आपको उन मानों को दस्तावेज करना चाहिए जिन्हें आप उम्मीद करते हैं और फिर अपने परीक्षण के लिए उपयोग करें। –

उत्तर

11

आप अपने परीक्षण विधि में पारित किए गए तर्कों को निर्दिष्ट करने के लिए TestCaseAttribute का उपयोग कर रहे हैं। हालांकि, यह बस तर्कों के रूप में सेट पास करने के लिए कोई समर्थन प्रदान नहीं करता है। आप देख सकते हैं कि यह Conversions को DUnitX.Utils इकाई में घोषित निरंतरदेखकर ऐसा है। यह किसी सेट में किसी भी रूपांतरण को ConvFail पर मानचित्र करता है।

तो, यदि आप विशेषताओं का उपयोग करके इस डेटा को निर्दिष्ट करना चाहते हैं तो आपको परीक्षण ढांचे का विस्तार करने की आवश्यकता होगी। आप अपने सेट तर्कों को डीकोड करने के लिए CustomTestCaseSourceAttribute से अपने स्वयं के वंशज प्राप्त कर सकते हैं और GetCaseInfoArray ओवरराइड कर सकते हैं। एक उदाहरण के रूप में कच्चे तेल की, तो आप इस इस्तेमाल कर सकते हैं: होगा

[MyTestCase('Demo2', 'InputB', [resWarn])] 
procedure Test(Input: string; ExpectedResult: TResultSet); 

मैं यहाँ सादगी के लिए RTTI का उपयोग कर से बचा लिया है, लेकिन RTTI का उपयोग कर:

type 
    MyTestCaseAttribute = class(CustomTestCaseSourceAttribute) 
    private 
    FCaseInfo: TestCaseInfoArray; 
    protected 
    function GetCaseInfoArray: TestCaseInfoArray; override; 
    public 
    constructor Create(const ACaseName: string; const AInput: string; const AExpectedResult: TResultSet); 
    end; 

constructor MyTestCaseAttribute.Create(const ACaseName, AInput: string; const AExpectedResult: TResultSet); 
begin 
    inherited Create; 
    SetLength(FCaseInfo, 1); 
    FCaseInfo[0].Name := ACaseName; 
    SetLength(FCaseInfo[0].Values, 2); 
    FCaseInfo[0].Values[0] := TValue.From<string>(AInput); 
    FCaseInfo[0].Values[1] := TValue.From<TResultSet>(AExpectedResult); 
end; 

function MyTestCaseAttribute.GetCaseInfoArray: TestCaseInfoArray; 
begin 
    Result := FCaseInfo; 
end; 

तब आप अपने परीक्षण विधि के लिए निम्न विशेषता जोड़ सकते हैं आपको अधिक लचीलापन देता है। आप तर्क को स्ट्रिंग के रूप में पास करेंगे, और इसे आरटीटीआई का उपयोग करके डीकोड करेंगे, जैसे कि डुनिटेक्स में कोड करता है। इसका मतलब है कि जब भी आप एक सेट तर्क का उपयोग करना चाहते हैं तो आपको bespoke विशेषताओं को लिखने की आवश्यकता नहीं है।

सेट को कवर करने के लिए Conversions मानचित्र को विस्तारित करके और इसे पैच के रूप में सबमिट करके DUnitX के भीतर इसे कार्यान्वित करना बेहतर होगा। मुझे यकीन है कि दूसरों को यह उपयोगी लगेगा।

+0

आपके उत्तर डेविड के लिए धन्यवाद, मैंने ड्यूनिटिक्स स्रोतों को भी देखना शुरू कर दिया, क्योंकि मैंने सोचा था कि सेट और सरणी के लिए समर्थन जोड़ना संभव हो सकता है। अब कम से कम मेरे पास एक प्रारंभिक बिंदु है। उस समय के लिए मैं आर 1, आर 2, आर 3 दृष्टिकोण का उपयोग करूंगा। इससे मुझे मेरी परियोजना के साथ आगे बढ़ने की अनुमति मिलती है ... –

+0

मैंने आपके कोड का उदाहरण यहां दिखाई देने से पहले अपना पहला जवाब लिखा था। अधिक बार F5 दबाएं :) धन्यवाद दस लाख! अब मैं जांचूंगा कि मैं आपके उदाहरण के साथ कितना दूर आऊंगा। –

+0

उत्तर में कोड थोड़ा लंगड़ा है क्योंकि यह उस परीक्षण विधि के लिए विशिष्ट है। वास्तव में आप आरटीटीआई के शीर्ष पर खड़े होना चाहते हैं। 'रूपांतरण [tkUString, tkSet] 'प्रदान करके करना मुश्किल नहीं है। –

10

32 तत्वों, अधिकतम 256 तत्वों के अपेक्षाकृत बड़े समूहों वहाँ अधिक है के लिए अप करने के लिए StringToSet और TValue सेट के लिए यह केवल काम करता है की सीमाओं के (कारण DUnitX.Utils को यह रूपांतरण समारोह जोड़ें और tkUString के लिए रूपांतरण मैट्रिक्स में यह tkSet डाला कोड हालांकि आवश्यक):

function ConvStr2Set(const ASource: TValue; ATarget: PTypeInfo; out AResult: TValue): Boolean; 
begin 
    TValue.Make(StringToSet(ATarget, ASource.AsString), ATarget, AResult); 
    Result := True; 
end; 

इसके अलावा, आप मापदंडों के लिए एक अलग विभाजक वर्ण का उपयोग करने की जरूरत है या उन्हें गलत बंट जाएगा:

[TestCase('Demo1','InputA;[resWarn,resError]', ';')] 
+1

यहां विभाजक की सही वर्तनी देखने के लिए अच्छा लगा। यकीन नहीं है कि मैं इसे सही करने के लिए DUnitX को बदलने का सुझाव देने के लिए खुद को ला सकता हूं! –

+0

शुद्ध रूप से दुर्घटना से;) –

+0

क्या ऑस्ट्रेलियाई लोगों के पास "अलग" वर्तनी नियम हैं? ;) कम से कम वे इसके बारे में डिनिटिक्स में असंगत हैं ... –

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

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