2017-03-25 5 views
1

Der folgende Code wird das Anheben und Ausnahme auf einer nicht-virtuellen auf einer Schnittstelle überprüfen, MOQ beschwert sich über:Ungültige

„Invalid auf einer nicht-virtuellen überprüfen“

aber ich bin eine Schnittstelle verspotten. Ich muss diese Art von Tests ein paar Mal durchgeführt haben, aber ich bin nicht in der Lage, herauszufinden, was das Problem dieses Mal ist.

[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

überprüfen müssen würde ich denken werde, wenn 'Publish' ist eine Erweiterung Methode und nicht eigentlich eine Methode auf der Schnittstelle? – Nkosi

+0

@ Nkosi du hast Recht, ich habe es gerade gefunden. Das macht die Dinge etwas komplizierter. – Marco

+0

Wenn Sie eine Vorstellung davon haben, welches Mitglied die Erweiterungsmethode tatsächlich aufruft, können Sie dies überprüfen, aber das wäre eine gute Schätzung, wenn Sie die inneren Funktionen der Erweiterung nicht kennen. – Nkosi

Antwort

2

es gefunden. IMessageHandlerContext erbt von IPipelineContext die eine Publish Methode

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

Ein extension method hat, die für die Schnittstelle zur Verfügung ein Argument nimmt, ist und diese Methode.

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

So die Erweiterungsmethode mit dem Modell zufrieden zu stellen Sie

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

@Marco, fand den Quellcode für die betreffende Schnittstelle und schlug eine Problemumgehung vor. – Nkosi

+0

Ich habe am Ende ihre eigenen Test-Bibliotheken verwendet. Danke trotzdem :) – Marco