2011-07-20 35 views
5

Các mã sau biên dịch, chạy, thực hiện chính xác những gì tôi đang mong đợi - những GreetingPublisher gọi bus.Publish() khi sự kiện này được nâng lên - nhưng thiết lập Moq không được phù hợp:Làm cách nào để sử dụng Moq để kiểm tra các cuộc gọi tới NServiceBus IBus.Publish()?

using Moq; 
using NServiceBus; 
using NUnit.Framework; 

namespace MyProject.Greetifier.Tests { 
    [TestFixture] 
    public class GreetingPublisher_Bus_Integration_Tests { 
     [Test] 
     public void Greeting_Is_Published_To_Bus() { 
      var mockGreeter = new Mock<IGreeter>(); 
      var mockBus = new Mock<IBus>(); 
      mockBus.Setup(bus => bus.Publish<IMessage>(It.IsAny<IMessage>())) 
        .Verifiable(); 
      var Greetifier = new GreetingPublisher(mockGreeter.Object, 
                mockBus.Object); 
      mockGreeter.Raise(m => m.Greet += null, "world"); 
      mockBus.Verify(); 
     } 
    } 

    public class HelloMessage : IMessage { 
     public string Name { get; set; } 
     public HelloMessage(string name) { this.Name = name; } 

    } 

    public class GreetingPublisher { 
     private readonly IGreeter greeter; 
     private readonly IBus bus; 

     public GreetingPublisher(IGreeter greeter, IBus bus) { 
      this.greeter = greeter; 
      greeter.Greet += handleGreetEvent; 
      this.bus = bus; 
     } 

     void handleGreetEvent(string name) { 
      bus.Publish(new HelloMessage(name)); 
     } 
    } 

    public delegate void GreetingEvent(string name); 

    public interface IGreeter { 
     event GreetingEvent Greet; 
    } 
} 

và khi chạy thử nghiệm, tôi nhận được:

Test 'MyProject.Greetifier.Tests.GreetingPublisher_Bus_Integration_Tests.Greeting_Is_Published_To_Bus' failed: 
Moq.MockVerificationException : The following setups were not matched: 
IBus bus => bus.Publish<IMessage>(new[] { It.IsAny<IMessage>() }) 
at Moq.Mock.Verify() 
D:\Projects\MyProject\src\MyProject.Greetifier.Tests\Program.cs(15,0): MyProject.Greetifier.Tests.GreetingPublisher_Bus_Integration_Tests.Greeting_Is_Published_To_Bus() 

Tôi có thiếu thứ gì đó hiển nhiên không?

Trả lời

6

Nếu tôi thấy chính xác, mã của bạn gọi IBus.Publish<HelloMessage> chứ không phải IBus.Publish<IMessage>.

(EDIT: Tôi thay

mockBus.Setup(bus => bus.Publish<IMessage>(It.IsAny<IMessage>())) 
       .Verifiable(); 

với:

mockBus.Setup(bus => bus.Publish<HelloMessage>(It.IsAny<HelloMessage>())) 
       .Verifiable(); 

và nó hoạt động như mong đợi - Dylan)

+0

Ah ... Tôi đã không nhận ra rằng It.IsAny sẽ không phù hợp với các lớp học thực hiện T ... cảm ơn! –

+0

Tôi hiện đang xử lý sự cố này. 'It.IsAny ()' _does_ khớp với một giao diện chung để triển khai thực hiện cụ thể trong Moq khi _not_ chế nhạo 'NServiceBus.IBus' và thậm chí hoạt động như mong đợi đối với các mảng của các kiểu giao diện chung (chẳng hạn như được chỉ định trong' IBus.Publish 'phương thức), nhưng vì một số lý do không thành công khi chế nhạo' IBus'. Điều này dường như có liên quan đến sự nhầm lẫn trên các loại cụ thể, có thể xuất phát từ việc xử lý các thông điệp của NServiceBus thông qua các proxy cụ thể, mặc dù tại sao nó cần thực hiện điều này trên Xuất bản hiện tại. – sennett

+0

@sennett: Tôi đề nghị bạn đăng một câu hỏi mới cho điều này với một số mã mẫu. Điều đó sẽ giúp bạn dễ dàng hơn. –

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