2017-03-25 41 views
1

下面的代码是提高和异常的,起订量抱怨:无效在非虚拟验证接口

“无效的确认在非虚拟”

但我嘲笑一个界面。我必须做好几次这类测试,但我无法弄清楚这次是什么问题。

[TestFixture] 
public class RegisterDeviceCommandHandlerTests 
{ 
    private RegisterDeviceCommandHandler _handler; 
    private readonly Mock<IClientRepository> _clientRepositoryMock = new Mock<IClientRepository>(); 
    private readonly Mock<IMessageHandlerContext> _busMock = new Mock<IMessageHandlerContext>(); 
    private readonly Mock<IClientEncryptionProvider> _clientEncryptionProviderMock = new Mock<IClientEncryptionProvider>(); 


    [Test] 
    public async Task GivenAnUnregisteredDeviceWhenTheDeviceIsAddedThenADeviceRegistrationCompletedEventShouldBePublished() 
    { 
     _clientRepositoryMock.Setup(x => x.RegisterClient(It.IsAny<byte[]>(), It.IsAny<string>(), 
       It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>())) 
      .Returns(RegistrationClientOperationResult.Registered); 

     var clientIdentity = new ClientIdentity 
     { 
      HostName = "HostName", 
      MacAddress = "MacAddress", 
      MachineId = "MachineId" 
     }; 

     _clientEncryptionProviderMock.Setup(x => x.DecryptIdentity(It.IsAny<byte[]>())).Returns(clientIdentity); 

     _handler = new RegisterDeviceCommandHandler(_clientEncryptionProviderMock.Object, _clientRepositoryMock.Object) 
     { 
      Bus = _busMock.Object 
     }; 

     await _handler.HandleAsync(new RegisterDeviceCommand 
     { 
      Identity = new byte[] { 1, 2 } 
     }); 

     _busMock.Verify(x => x.Publish(It.IsAny<DeviceRegistrationCompletedEvent>())); 
    } 
} 
+1

如果我想'Publish'是一个扩展方法,而不是实际的接口上的方法? – Nkosi

+0

@Nkosi你说得对,我刚刚找到了它。这使得我有点复杂。 – Marco

+0

如果您知道扩展方法实际调用的是什么成员,则可以验证,但如果您不知道扩展的内部运作情况,那么这将是一个很好的猜测。 – Nkosi

回答

2

找到它了。从IPipelineContextIMessageHandlerContext继承其具有Publish方法

/// <summary> 
/// Publish the message to subscribers. 
/// </summary> 
/// <param name="message">The message to publish.</param> 
/// <param name="options">The options for the publish.</param> 
Task Publish(object message, PublishOptions options); 

一种extension method它有一个参数可用于接口和方法。

/// <summary> 
/// Publish the message to subscribers. 
/// </summary> 
/// <param name="context">The instance of <see cref="IPipelineContext" /> to use for the action.</param> 
/// <param name="message">The message to publish.</param> 
public static Task Publish(this IPipelineContext context, object message) 
{ 
    Guard.AgainstNull(nameof(context), context); 
    Guard.AgainstNull(nameof(message), message); 

    return context.Publish(message, new PublishOptions()); 
} 

因此,要满足与模拟扩展方法,你就需要验证

_busMock.Verify(_ => _.Publish(It.IsAny<DeviceRegistrationCompletedEvent>(), Is.IsAny<PublishOptions>())); 
+0

@Marco,找到有问题的界面的源代码,并提出了一种解决方法。 – Nkosi

+0

我最终使用他们自己的测试库。不管怎么说,还是要谢谢你 :) – Marco