2013-02-07 15 views
5

कैसे आप निम्नलिखित faking के बारे में जाना होगा Faking:एक सामान्य विधि FakeItEasy

public interface IBlah 
{ 
    Func<T, bool> ApplyFilter<T>(Func<T, bool> predicate) where T:IMessage; 
} 

क्या मैं चाहते हैं के लिए नकली बस वापस जाने के लिए यह किसी भी बदलाव के बिना तर्क है। हालांकि, मैं यह सत्यापित करना चाहता हूं कि फर्जी को बिल्कुल एक बार बुलाया गया है। एक उपयोग के मामले नीचे दिया गया है

public class Something 
    { 

    public Something(IBlah blah) { _blah = blah; } 

    public bool DoSomething(SomeValue m, Func<SomeValue, bool> predicate) 
    { 
     Func<SomeValue, bool> handler = _blah.ApplyFilter(predicate); 
     return handler(m); 
    } 
    } 

अर्थात नकली जरूरतों के माध्यम से एक पास के रूप में कार्य करने के लिए लेकिन मैं यह भी इसका इस्तेमाल किया गया है सत्यापित करने में सक्षम होने की जरूरत है।

इस बारे में जाने का सबसे अच्छा तरीका क्या है?

[कृपया काल्पनिक उदाहरण के बारे में चिंता मत करो ... वहाँ कवर के तहत चल रहा है बहुत कुछ है, लेकिन मैं यह ऊपर के उदाहरण के लिए नीचे सरल बना दिया है।]

+1

आप सत्यापित करें कि यह एक बार से अधिक प्रयोग किया जाता है चाहता हूँ, कम से कम एक बार उपयोग किया है, या ठीक एक बार इस्तेमाल किया है? क्या होगा यदि यह उस स्थिति को पूरा नहीं करता है? क्या उस इंटरफ़ेस में 'numInvocations' प्रॉपर्टी होनी चाहिए? आप सत्यापित कर सकते हैं कि इसे आसानी से पर्याप्त * से अधिक * नहीं कहा जाएगा, लेकिन यह जानकर कि उसे कॉल नहीं किया गया है ... आपको फीडबैक प्रदान करने के लिए एक तरीका चाहिए। – Servy

+0

जेनरिक शामिल किए बिना, मैं var fake = A.Fake () के साथ ऐसा ही कर सकता हूं; एकॉलटो (() ==> नकली। कुछ विधि (ए ._)) । पुनर्नवीनीकरण (x => x.GetArgument (0)); .... एकॉलटो (नकली) .स्टहॉव हुआ (दोहराया गया। ठीक है। एक बार); मैं यह नहीं समझ सकता कि Func सामान्य के साथ ऐसा कैसे करें। मैंने इंटरफ़ेस के डमी कार्यान्वयन को बनाने का प्रयास किया है, और यह गुजर सकता है, लेकिन चूंकि यह ठोस है, इसलिए FakeItEasy यह सत्यापित नहीं कर सकता कि इसका उपयोग किया गया था। – ashic

+0

इसलिए यह सुनिश्चित करने के लिए कि आपको यह सुनिश्चित करने की ज़रूरत है कि एक बार जब आप दो गुणों, 'न्यूमवोकेशन' और इस फ़ंक्शन वाले वर्ग को वापस करने की विधि चाहते हैं। फ़ंक्शन को कहीं और पास करें, फिर यह निर्धारित करें कि 'NumInvokations' एक के बराबर है या नहीं। – Servy

उत्तर

2

इससे आपकी समस्या का समाधान होगा ? यह विधेय से होकर गुजरेगी और यह भी सत्यापित करें कि ApplyFilter ठीक एक बार कहा जाता था

[Fact] 
    public void TestFeature() 
    { 
     var fake = A.Fake<IBlah>(); 
     A.CallTo(() => fake.ApplyFilter(A<Func<int, bool>>.Ignored)).ReturnsLazily(x => 
      { 
       return x.GetArgument<Func<int, bool>>("predicate"); 
      }); 
     var something = new Something(fake); 
     var result = something.DoSomething(1, x => x > 1); 

     Assert.False(result); 
     A.CallTo(() => fake.ApplyFilter(A<Func<int, bool>>.Ignored)).MustHaveHappened(Repeated.Exactly.Once); 
    } 
+0

जबकि यह int होने के लिए टी निर्दिष्ट करते समय काम करेगा, मैं एक सामान्य संस्करण की तलाश में हूं जो कि किसी भी प्रकार के लिए काम करना चाहिए। निम्नलिखित प्रकार के शो जो मैं प्राप्त करने की कोशिश कर रहा हूं: http://pastebin.com/fJgi6ikj दूसरे शब्दों में, नकली * किसी भी * IMessage के लिए सटीक प्रकार निर्दिष्ट किए बिना काम करना चाहिए। – ashic

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