Spöttische Erweiterung Methoden mit Moq
Habe ich eine bereits vorhandene Schnittstelle...
public interface ISomeInterface
{
void SomeMethod();
}
und ich habe verlängert intreface mit einem mixin...
public static class SomeInterfaceExtensions
{
public static void AnotherMethod(this ISomeInterface someInterface)
{
//Implementation here
}
}
Habe ich eine Klasse, das ist Berufung, die ich testen will...
public class Caller
{
private readonly ISomeInterface someInterface;
public Caller(ISomeInterface someInterface)
{
this.someInterface = someInterface;
}
public void Main()
{
someInterface.AnotherMethod();
}
}
und einem test, bei dem möchte ich verspotte die Schnittstelle, und überprüfen Sie den Aufruf der extension-Methode...
[Test]
public void Main_BasicCall_CallsAnotherMethod()
{
//Arrange
var someInterfaceMock = new Mock<ISomeInterface>();
someInterfaceMock.Setup(x => x.AnotherMethod()).Verifiable();
var caller = new Caller(someInterfaceMock.Object);
//Act
caller.Main();
//Assert
someInterfaceMock.Verify();
}
Läuft dieser test jedoch eine Ausnahme generiert...
System.ArgumentException: Invalid setup on a non-member method:
x => x.AnotherMethod()
Meine Frage ist, ist es ein schöner Weg, um mock aus der mixin-Aufruf?
In meiner Erfahrung, sind die Bedingungen mixin und Erweiterung der Methoden sind getrennte Dinge. Ich würde das letztere in diesem Fall zu vermeiden, mixups 😛
Duplikat von: stackoverflow.com/questions/562129/....
Duplikat von: stackoverflow.com/questions/562129/....
InformationsquelleAutor Russell Giddings | 2010-02-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man nicht "direkt" mock-statische Methode (also Erweiterung Methode) mit mocking framework. Sie können versuchen, Maulwürfe (http://research.microsoft.com/en-us/projects/pex/downloads.aspx), ein kostenloses tool von Microsoft, die einen anderen Ansatz.
Hier ist die Beschreibung von dem tool:
Können Sie die Maulwürfe mit testing-Frameworks (ist unabhängig).
Maulwürfe in der Theorie gut ist, aber ich fand drei Probleme, wenn ich erprobt es, die mich gestoppt, die es... 1) Es läuft nicht in den Resharper NUnit runner 2) müssen Sie manuell erstellen Sie einen Maulwurf Montage für jede gekürzte Montage 3), müssen Sie manuell neu ein Maulwurf Montage, sobald eine gekürzte Methode ändert.
InformationsquelleAutor Daniele Armanasco
Benutzt habe ich einen Wrapper um dieses problem zu erhalten. Erstellen Sie ein wrapper-Objekt, und übergeben Sie Ihr verspottet Methode.
Sehen Mocking Statische Methoden für Unit-Tests von Paul Irwin, hat schöne Beispiele.
Ich erstellte eine kleine Bibliothek umschließt, Dapper, Dapper.Contrib und IDbConnection. github.com/codeapologist/DataAbstractions.Dapper
InformationsquelleAutor Alvis
Fand ich, dass ich hatte, zu entdecken, die Innenseite der Erweiterung Methode, die ich versucht hatte, Sie zu verspotten, der Eingang, und zu spotten, was Los war in der Verlängerung.
Sah ich eine Erweiterung wie das hinzufügen von code, der direkt zu Ihrer Methode. Dies bedeutete, dass ich brauchte, um zu verspotten, was passiert im inneren der Erweiterung eher als die Erweiterung selbst.
InformationsquelleAutor chris31389
Möchte ich den wrapper (adapter pattern) als ich die Verpackung des Objekts selbst. Ich bin mir nicht sicher, ich würde verwenden, für die Verpackung eine Erweiterung Methode, die nicht Teil des Objekts.
Verwende ich eine interne Faul Injizierbaren im Eigentum von Art-Action, Func, Predicate, oder delegieren und damit für die Injektion (Auslagerung) der Methode bei einem unit-test.
Dann rufen Sie die Func-anstelle der eigentlichen Methode.
Für ein vollständigeres Beispiel, check-out http://www.rhyous.com/2016/08/11/unit-testing-calls-to-complex-extension-methods/
InformationsquelleAutor Rhyous
Können Sie ein mock-test-Schnittstelle erbt von der realen und hat ein Mitglied mit der gleichen Signatur wie die extension-Methode.
Dann können Sie spotten der test-Oberfläche, fügen Sie die echten mock-und rufen Sie die test-Methode in der setup.
Ihre Implementierung der mock können Sie dann rufen, was Methode Sie möchten, oder Sie einfach überprüfen, dass die Methode aufgerufen wird:
Dank Håvard S Lösung in dieser Beitrag für die Umsetzung eines mock, unterstützt Schnittstelle. Einmal fand ich es, die Anpassung mit der test-Oberfläche und die statische Methode war, einen Kuchen zu Fuß.
InformationsquelleAutor pasx