2015-05-22 13 views
5

Tôi một phần chế giễu một lớp học có hai phương pháp:Nsubstitute Calls Phương pháp trong khi mặc dù có 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); 
} 

Trong thử nghiệm của tôi [SetUp] tôi có những cuộc gọi:

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

Tôi có không có vấn đề với các cuộc gọi Broadcast trên dòng này hoặc sau này khi tôi gọi phương pháp (họ không làm bất cứ điều gì như mong đợi) nhưng kỳ lạ dòng thứ ba của tôi ném một lỗi:

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

Tôi bị mất một chút vì tôi đã làm điều tương tự cho cả hai phương pháp và nhận được một hành vi khác nhau, tại sao phương thức của tôi gọi là EmitTo?

Trả lời

9

NSubstitute giống như hầu hết các khuôn khổ giả mạo chỉ có thể chặn cuộc gọi đến các phương thức virtual. Nó có thể dừng cuộc gọi đến Broadcast, bởi vì nó là ảo. Bạn cần phải thực hiện EmitTo ảo nếu bạn muốn ngừng gọi nó. Cần phải:

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

Tôi rất tập trung vào phần còn lại tôi đã bỏ lỡ cơ bản, cảm ơn rất nhiều. – Lomithrani

+1

Câu trả lời đúng đã được đưa ra nhưng tôi cũng muốn thêm liên kết tới tài liệu cho người dùng khác: http://nsubstitute.github.io/help/partial-subs/ –

Các vấn đề liên quan