2013-02-06 52 views
18

कहा गया था इस आलेख (How to moq a Func) से प्रश्न उठाएं और इसे अनुकूलित करें क्योंकि उत्तर सही नहीं है।मॉक को मॉक करने के लिए एक Func <> कन्स्ट्रक्टर पैरामीटर और सत्यापित करें इसे दो बार

public class FooBar 
{ 
    private Func<IFooBarProxy> __fooBarProxyFactory; 

    public FooBar(Func<IFooBarProxy> fooBarProxyFactory) 
    { 
     _fooBarProxyFactory = fooBarProxyFactory; 
    } 

    public void Process() 
    { 
     _fooBarProxyFactory(); 
     _fooBarProxyFactory(); 
    } 
} 

मैं एक समारोह <> है कि एक निर्माता पैरामीटर के रूप में पारित हो जाता है, ज़ोर कि समारोह कॉल दो बार था उपहास करने के लिए एक की जरूरत है।

फ़ंक्शन को मॉक करने का प्रयास करते समय var funcMock = new Mock<Func<IFooBarProxy>>(); Moq उठाता है और अपवाद करता है क्योंकि Func प्रकार mockable नहीं है।

समस्या यह है कि func का मज़ाक उड़ाए बिना यह सत्यापित करना संभव नहीं है कि func (n) बार कहा जाता है। funcMock.Verify((), Times.AtLeast(2));

+0

मोक अब ओपी मूल रूप से करने की कोशिश कर रहा है, इसका समर्थन करता है, @ ktam33 से जवाब देखें – Mike

उत्तर

27

मुझे नहीं लगता कि Func के लिए एक नकली उपयोग करना आवश्यक है।

आप बस अपने आप को समारोह एक साधारण बना सकते हैं कि IFooBarProxy की एक नकली रिटर्न:

int numberOfCalls = 0; 
Func<IFooBarProxy> func =() => { ++numberOfCalls; 
            return new Mock<IFooBarProxy>(); }; 

var sut = new FooBar(func); 

sut.Process(); 

Assert.Equal(2, numberOfCalls); 
2

Moq v4.1.1308.2120

के बाद से इस संस्करण है, जो कुछ महीने जारी किया गया था के रूप में के बाद यह प्रश्न पूछा गया था (21 अगस्त, 2013), Func<>has been added नकली करने की कार्यक्षमता। तो नकली के किसी भी मौजूदा संस्करण के साथ, आप var funcMock = new Mock<Func<IFooBarProxy>>(); का उपयोग कर सकते हैं।

मूल (पुराना) जवाब

आप कॉलबैक Func की, Actions, आदि का एक बहुत है, तो उसे अपने परीक्षण में एक सहायक के इंटरफेस को परिभाषित करने और है कि इंटरफ़ेस उपहास करने के लिए बेहतर है। इस तरह से आप वापसी मूल्यों की स्थापना, इनपुट तर्क परीक्षण की तरह नियमित रूप से Moq कार्यक्षमता का उपयोग कर सकते हैं, आदि

interface IFooBarTestMethods 
{ 
    IFooBarProxy FooBarProxyFactory(); 
} 

प्रयोग

var testMethodsMock = new Mock<IFooBarTestMethods>(); 
testMethodsMock 
    .Setup(x => x.FooBarProxyFactory()) 
    .Returns(new Mock<IFooBarProxy>()); 

var sut = new FooBar(testMethodsMock.Object.FooBarProxyFactory); 
testMethodsMock.Verify(x => x.FooBarProxyFactory(), Times.Exactly(2)); 
6

कम से कम MOQ 4.5.28, आप कर सकते हैं के रूप में नकली और Func सत्यापित करें जैसा कि आप करने में सक्षम होने की उम्मीद करेंगे। मैं यह नहीं कह सका कि यह सुविधा कब जोड़ा गया था (मूल बिंदु के अनुसार किसी बिंदु पर यह काम नहीं करता था)।

[Test] 
public void TestFoobar() 
{ 
    var funcMock = new Mock<Func<IFooBarProxy>>(); 
    var fooBar = new FooBar(funcMock.Object); 
    fooBar.Process(); 
    funcMock.Verify(x => x(), Times.AtLeast(2)); 
}