Как я могу использовать Moq для проверки вызовов NServiceBus IBus.Publish ()? - PullRequest
5 голосов
/ 20 июля 2011

Следующий код компилируется, запускается, выполняет именно то, что я ожидаю - GreetingPublisher вызывает bus.Publish () при возникновении события, но настройки Moq не совпадают:

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;
    }
}

и при запуске теста я получаю:

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

Я что-то упускаю из виду?

1 Ответ

6 голосов
/ 20 июля 2011

Если я правильно вижу, ваш код вызывает IBus.Publish<HelloMessage>, а не IBus.Publish<IMessage>.

(РЕДАКТИРОВАТЬ: я заменил

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

с:

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

и все работает как положено - Дилан)

...