2011-07-20 19 views
5

El código siguiente se compila, ejecuta, hace exactamente lo que estoy esperando - la GreetingPublisher llama bus.Publish() cuando se eleva el caso - pero la configuración Moq no está siendo igualada:¿Cómo uso Moq para probar llamadas a 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; 
    } 
} 

y cuando ejecutando la prueba, obtengo:

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

¿Echo de menos algo obvio?

Respuesta

6

Si lo veo correctamente, su código llama al IBus.Publish<HelloMessage> y no a IBus.Publish<IMessage>.

(EDIT: He sustituido

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

con:

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

y funciona como se esperaba - Dylan)

+0

Ah ... No me había dado cuenta de que It.IsAny no coincidiría con las clases que implementan T ... ¡gracias! –

+0

Actualmente estoy lidiando con este problema. 'It.IsAny ()' _does_ coincide con una interfaz genérica para una implementación concreta en Moq cuando _no_ burla 'NServiceBus.IBus', e incluso se comporta como se espera para las matrices de tipos de interfaz genéricos (como se especifica en el' IBus.Publish 'método), pero por alguna razón falla al burlarse de' IBus'. Esto parece tener algo que ver con la confusión sobre tipos específicos, posiblemente debido al manejo de mensajes de NServiceBus como interfaces a través de proxies concretos, aunque me elude por qué necesita hacer esto en Publish actualmente. – sennett

+0

@sennett: sugiero que publique una nueva pregunta para esto con un código de muestra. Eso hará que sea más fácil ayudarte. –

Cuestiones relacionadas