2013-02-06 12 views
18

Zrobiłem pytanie z tego artykułu (How to moq a Func) i dostosowałem go, ponieważ odpowiedź jest nieprawidłowa.Używanie Moq do makiety parametru konstruktora <> i sprawdzenie, czy został wywołany dwa razy:

public class FooBar 
{ 
    private Func<IFooBarProxy> __fooBarProxyFactory; 

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

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

Mam potrzebę Mock Func <>, który jest przekazywany jako parametr konstruktorze twierdzą, że func było wywołanie dwukrotnie.

Podczas próby wyśmiewania funkcji var funcMock = new Mock<Func<IFooBarProxy>>(); Moq podnosi się i powoduje wyjątek, ponieważ typ Func nie jest możliwy do wykonania.

Problem polega na tym, że bez szyderstwa func nie można sprawdzić, czy func został wywołany (n) razy. funcMock.Verify((), Times.AtLeast(2));

+0

Moq obsługuje teraz to, co OP próbował pierwotnie zrobić, zobacz odpowiedź z @ ktam33 – Mike

Odpowiedz

27

Nie sądzę, że konieczne jest użycie makiety dla Func.

można po prostu stworzyć zwykły Func siebie, która zwraca próbną IFooBarProxy:

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

var sut = new FooBar(func); 

sut.Process(); 

Assert.Equal(2, numberOfCalls); 
2

Od Min v4.1.1308.2120

Począwszy od tej wersji, która ukazała się kilka miesięcy po tym padło pytanie (21 sierpnia 2013 r.), Funkcja do kpienia z Func<>has been added. Tak więc przy każdej aktualnej wersji próbnej można użyć var funcMock = new Mock<Func<IFooBarProxy>>();.

Original (nieaktualne) odpowiedź

Jeśli masz dużo zwrotnego Func „s, Actions, etc, to lepiej, aby zdefiniować interfejs pomocnika w badaniach i wyśmiewać tego interfejsu. W ten sposób można korzystać z regularnych funkcjonalność Min, jak utworzenie wartości zwracanych, testowanie argumenty wejściowe itp

interface IFooBarTestMethods 
{ 
    IFooBarProxy FooBarProxyFactory(); 
} 

Wykorzystanie

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

Jako przynajmniej Moq 04.05.28, można udawaj i weryfikuj Func, jak można się tego spodziewać. Nie mogłem powiedzieć, kiedy ta funkcja została dodana (zgodnie z pierwotnym pytaniem w pewnym momencie to nie zadziałało).

[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)); 
} 
Powiązane problemy