2012-06-12 15 views
24

Mam klasę, która pobiera argumenty jako delegat. Ta klasa wywołuje tego delegata, a ja chcę przetestować go za pomocą Moq. Jak mogę sprawdzić, czy ta metoda została wywołana?Weryfikacja delegata została wywołana przez Moq

przykład klasa:

public delegate void Foo(int number); 

public class A 
{ 
    int a=5; 

    A (Foo myFoo) 
    { 
     Foo(a); 
    } 
} 

i chcę, aby sprawdzić, czy Foo nazwano. Dziękuję.

+3

Myślę, że to musisz zmienić akceptowaną odpowiedź, ponieważ odpowiedź @Lukazoid jest bardziej właściwa niż twój wybór. –

+0

W konstruktorze, czy wiersz powinien przeczytać 'myFoo (a)'? Wzywasz tej instancji 'Foo', a nie samej klasy' Foo', prawda? –

Odpowiedz

28

Co z wykorzystaniem anonimowej funkcji? Może zachowywać się w tym miejscu, nie potrzebujesz ramy szyderczej.

bool isDelegateCalled = false; 
var a = new A(a => { isDelegateCalled = true}); 

//do something 
Assert.True(isDelegateCalled); 
3

Moq nie obsługuje szyderczych delegatów. Ale można stworzyć jakiś interfejs, metodą, która pasuje do Twojego podpisu Delegat:

public interface IBar 
{ 
    void M(int number); 
} 

następnie utworzyć mock, który implementuje ten interfejs, a korzystać z tej atrapa obiektu, aby utworzyć Delegat:

Mock<IBar> bar = new Mock<IBar>(); 
Foo foo = new Foo(bar.Object.M); 
A a = new A(foo); 
bar.Verify(x => x.M(5)); 

po ćwiczeniach Twój sut, będziesz mógł zweryfikować oczekiwania na swoim wyśmianym obiekcie.

AKTUALIZACJA: W rzeczywistości można po prostu przekazać bar.Object.M do swojego sut, bez tworzenia egzemplarza delegata Foo. W każdym razie drwiący delegat wymaga stworzenia interfejsu.

+0

Po prostu FYI, Moq teraz obsługuje kpiny z delegatów widzę moją odpowiedź i [tutaj] (https://github.com/Moq/moq4/commit/e614ae5b4a14896503b59e2a70ac799bb66e741b) – Lukazoid

3

można zrobić coś takiego:

public interface IWithFOOMethod 
{ 
    void FooAlikeMethod(int number); 
} 

Mock<IWithFOOMethod> myMock = new Mock<IWithFOOMethod>(); 

A a = new A(myMock.Object.FooAlikeMethod); 

myMock.Verify(call => call.Foo(It.IsAny<int>()), Times.Once()) 
1

Od Moq nie obsługuje szyderczy delegatów, ja zwykle sobie z tym poradzić z czymś takim:

var list = new List<int>(); 
var del = i => list.Add (i); 
var a = new A(del); 
list.ShouldContainOnly (new[] { 5 }); 

gdzie delegat warunkiem wykonuje niektóre proste, weryfikowalne działanie.

+1

Po prostu FYI, Moq teraz obsługuje kpiny z delegatów widzę moje odpowiedź i [tutaj] (https://github.com/Moq/moq4/commit/e614ae5b4a14896503b59e2a70ac799bb66e741b) – Lukazoid

32

Od this commit Min obsługuje teraz szyderczy delegatów, dla danej sytuacji byłoby to zrobić tak:

var fooMock = new Mock<Foo>(); 
var a = new A(fooMock.Object); 

Następnie można zweryfikować delegat został wywołany:

fooMock.Verify(f => f(5), Times.Once); 

Lub:

fooMock.Verify(f => f(It.IsAny<int>()), Times.Once); 
Powiązane problemy