2017-02-09 2 views
0

Ich habe einen einfachen Komponententest, der überprüft werden muss, ob meine Methode die IModel.BasicPublish Methode aufruft. Also schrieb ich einen einfachen Unit-Test:Mock rabbitMQ IModel überprüfen Fehler

[TestMethod] 
    public void RequestAdded() 
    { 
     const string url = "http://localhost"; 
     var urlBytes = Encoding.UTF8.GetBytes(url); 

     _proxyService.AddRequest(url); 

     _moqModel.Verify(x => x.BasicPublish(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<IBasicProperties>(), urlBytes), Times.Once); 
    } 

Allerdings, wenn ich laufe ich erhalte eine Fehlermeldung: invalid verify on a non-virtual member.

Ich dachte, das könnte nur bei konkreten Klassen auftreten, aber nicht bei einer Schnittstelle.

private Mock<IModel> _moqModel;

Irgendwelche Gedanken?

+0

haben Sie versucht ... _moqModel.As () .Verify (x => x.BasicPublish (It.IsAny (), It.IsAny (), It.IsAny (), urlBytes), Times.Once); –

+1

Überprüfen Sie, ob BasicPublish ein Schnittstellenmitglied oder eine Erweiterungsmethode ist. Die Verwendung von BasicPublish als Erweiterungsmethode anstelle eines tatsächlichen Members könnte diese Ausnahme verursacht haben. –

+0

Stellen Sie [mcve] bereit, mit der das Problem reproduziert werden kann. Nicht genug Kontext in diesem Beispiel als das, was derzeit angezeigt wird, sollte diesen Fehler nicht verursachen. – Nkosi

Antwort

0

BasicPublish Unterschrift:

public void BasicPublish(string exchange, string routingKey, bool mandatory, IBasicProperties basicProperties, byte[] body) 

Moq und anderes ähnliches spöttisches Frameworks kann nur Mock-Schnittstellen, abstrakte Methoden/Eigenschaften (auf abstrakte Klassen) oder virtuelle Methoden/Eigenschaften auf konkrete Klassen.

Dies ist, weil es einen Proxy generiert, der die Schnittstelle implementiert oder eine abgeleitete Klasse erstellt, die diese überschreibbaren Methoden überschreibt, um Aufrufe abzufangen.