2013-02-06 5 views
18

Die Frage aus diesem Artikel (How to moq a Func) genommen und angepasst, da die Antwort nicht korrekt ist.Verwenden von Moq, um einen Func <> Konstruktorparameter zu verspotten und zu überprüfen, dass es zweimal aufgerufen wurde

public class FooBar 
{ 
    private Func<IFooBarProxy> __fooBarProxyFactory; 

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

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

Ich habe eine Notwendigkeit, eine Func <> zu verspotten, die als Konstruktor Parameter übergeben wird, die behaupten, dass die func Anruf zweimal war.

Beim Versuch, die Funktion var funcMock = new Mock<Func<IFooBarProxy>>(); Mock raised und Ausnahme als der Func-Typ ist nicht vorstellbar.

Das Problem ist, dass ohne zu spotten die Funktion ist es nicht möglich zu überprüfen, dass die Funktion wurde (n) mal aufgerufen. funcMock.Verify((), Times.AtLeast(2));

+0

Moq unterstützt jetzt, was das OP ursprünglich versuchte zu tun, siehe die Antwort von @ ktam33 – Mike

Antwort

27

Ich denke nicht, dass es notwendig ist, einen Mock für den Func zu verwenden.

Sie können einfach eine gewöhnliche Func selbst erstellen, die eine Schein von IFooBarProxy zurückgibt:

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

var sut = new FooBar(func); 

sut.Process(); 

Assert.Equal(2, numberOfCalls); 
2

Seit Moq v4.1.1308.2120

Ab dieser Version, die einige Monate veröffentlicht wurde, nachdem diese Frage gestellt wurde (21. August 2013), die Funktionalität zu spotten Func<>has been added. Mit jeder aktuellen Version von Mock können Sie var funcMock = new Mock<Func<IFooBarProxy>>(); verwenden.

Original (veraltet) Antwort

Wenn Sie eine Menge von Rückruf haben Func ‚s, Actions, etc, dann ist es besser, einen Helfer-Schnittstelle in Ihren Tests zu definieren und diese Schnittstelle verspotten. Auf diese Weise können die regelmäßige Moq Funktionalität nutzen können, wie Rückgabewerte einrichten, Eingabeargumente Prüfung usw.

interface IFooBarTestMethods 
{ 
    IFooBarProxy FooBarProxyFactory(); 
} 

Nutzungs

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

Ab mindestens Moq 4.5.28, können Sie Spotte und verifiziere den Func so, wie du es erwarten würdest. Ich konnte nicht sagen, wann diese Funktion hinzugefügt wurde (laut der ursprünglichen Frage funktionierte das irgendwann nicht).

[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)); 
} 
Verwandte Themen