2015-05-22 12 views
5

jestem częściowo szyderczy klasę, która ma te dwie metody:Nsubstitute wywołuje metodę w przypadku, chociaż nie jest DoNotCallBase

public void EmitTo(string connectionId, ChatMessage message) 
{ 
    Clients.Client(connectionId).broadcastMessage(message.User.UserName, message.Message); 
} 

public virtual void Broadcast(ChatMessage message) 
{ 
    Clients.All.broadcastMessage(message.User.UserName, message.Message); 
} 

W moim teście [SetUp] mam te połączenia:

hub = Substitute.ForPartsOf<ChatHub>(myMockedClient, context, groupManager); 
hub.When(x => x.Broadcast(Arg.Any<ChatMessage>())).DoNotCallBase(); 
hub.When(x => x.EmitTo(Arg.Any<string>(), Arg.Any<ChatMessage>())).DoNotCallBase(); 

mam nie ma problemów z połączeniem Broadcast w tej linii lub później, gdy wywołuję metodę (nie robią nic zgodnie z oczekiwaniami), ale dziwnie moja trzecia linia powoduje błąd:

System.ArgumentException : Argument cannot be null or empty Parameter name: connectionId

Jestem trochę zagubiony, ponieważ zrobiłem dokładnie to samo dla obu metod i otrzymałem inne zachowanie, dlaczego moja metoda nazywa się EmitTo?

Odpowiedz

9

NSubstitute, jak większość szyderczych frameworków, może przechwytywać tylko połączenia z metodami virtual. Jest w stanie zatrzymać połączenie z numerem Broadcast, ponieważ jest wirtualne. Musisz zrobić wirtualny EmitTo, jeśli chcesz przestać go wywoływać. Musi to być:

public virtual void EmitTo(string connectionId, ChatMessage message) 
{ 
    Clients.Client(connectionId).broadcastMessage(message.User.UserName, message.Message); 
} 
+0

Byłem tak skoncentrowany na reszcie, że tęskniłem za podstawowymi, bardzo dziękuję. – Lomithrani

+1

Prawidłowa odpowiedź jest już podana, ale chciałem dodać link do dokumentacji także dla innych użytkowników: http://nsubstitute.github.io/help/partial-subs/ –

Powiązane problemy