2015-05-22 3 views
5

Я частично насмешливый класс, который имеет эти два метода:Nsubstitute вызывает метод в Когда даже если есть 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); 
} 

В моем тесте [SetUp] у меня есть эти вызовы:

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(); 

у меня есть нет проблем с вызовом Broadcast в этой строке или позже, когда я вызываю метод (они ничего не делают, как ожидалось), но, как ни странно, моя третья строка вызывает ошибку:

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

Я немного потерялся, так как я сделал то же самое для обоих методов и получил другое поведение, почему мой метод, когда метод вызывает EmitTo?

ответ

9

NSubstitute, как и большинство насмешливых фреймворков, может перехватывать вызовы только до virtual методов. Он способен остановить вызов до Broadcast, потому что он виртуальный. Вы должны сделать виртуальную виртуальную машину EmitTo, если хотите остановить ее. Это должно быть:

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

Я был так сосредоточен на остальном, что пропустил основное, спасибо большое. – Lomithrani

+1

Правильный ответ уже дан, но я хотел добавить ссылку на документацию и для других пользователей: http://nsubstitute.github.io/help/partial-subs/ –