Wie kann ich verspotte diese statische Methode
Habe ich diesen code:
public static bool IsValidVoucher(string id)
{
//read tsv files
var temp1 = AppData.GetAppData("stringval");
//code that need to be tested
return true;
}
Und ich mag zu erstellen, unit-test, aber wie kann ich verspotte AppData.GetAppData("stringval")
zu, was ich will, der Wert ist, so kann ich testen, den rest des Codes.
AppData-Klasse:
public class AppData
{
public static object GetAppData(string name)
{
//...
}
}
- Statt hardcoding 'AppData.GetAppData' könnten Sie injizieren einer Klasse, die macht die Lektüre der AppData und dann in Ihre unit-Tests, mock, die Klasse und setup der return-Wert, den Sie brauchen.
- Mit Moq nicht möglich, ohne weitere änderungen am source-code. Aber mit Typemock Isolator ist es ist möglich. Allerdings Isolator ist nicht frei.
- Und hier ein paar mehr Infos über Spott statische Methoden. Und hier Antwort SO aus. HTH
- mögliche Duplikate von Mock-statische Konstanteneigenschaft mit moq
- Ich habe fiel meine Antwort, weil ich glaube, dass es nicht helfen wird, in diesem Szenario. Jedenfalls wissen Sie jetzt, dass der Ausdruck Bäume sind da, um zu helfen, eine Menge!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Statische Methoden können nicht verspottet auf einfache Art und Weise. Sie haben grundsätzlich zwei Möglichkeiten:
Wenn du den
AppData
Klasse, ändern Sie die Implementierung eine Schnittstelle implementieren (z.B.IAppData
) und entfernen Sie diestatic
Modifikator auf dieGetAppData
Methode, so können Sie verspotten es.Wenn Sie nicht selbst die
AppData
- Klasse, verwenden Sie eine wrapper-Klasse (z.B.AppDataWrapper
), die eine Schnittstelle implementiert, und rufen diese Methode ausIsValidVoucher
statt:Können Sie dann unit-test
Foo
mit Moq (mit xunit hier nur als ein Beispiel):Gut, ich denke jeder hat seine Kommentare so weit ist technisch korrekt - mit so etwas wie
RhinoMocks
oderMoq
, kann man wirklich nicht verspotten statische Methoden in eine einfache, unkomplizierte Weise.Aber mit
Moles
Sie können es auf jeden Fall. Also, wenn Sie signifikant (derzeit) untestable code, der sich innerhalb von statischen Methoden, ich denke, Sie sollten sich in Maulwürfe.(Dieser link ist ein bisschen veraltet, aber ich finde es trotzdem hilfreich)
http://research.microsoft.com/en-us/projects/pex/molesmanual.pdf
(Schlüssel, text)
Wie es funktioniert: Angenommen, Sie haben eine typische situation, wie diese:
Die Verwendung von Moles, Ihre test-code würde wie folgt Aussehen:
Natürlich müssen Sie die Maulwürfe in Ihrem Projekt testen, so sicher sein, um danach zu suchen - viele web-Ressourcen, um Ihnen zu helfen auf Ihrem Weg.
Einige hilfreiche Beiträge:
https://msdn.microsoft.com/en-us/library/ff798308.aspx
http://adventuresdotnet.blogspot.com/2011/03/mocking-static-methods-for-unit-testing.html
https://wannabeegeek.wordpress.com/2013/03/13/unit-testing-made-easy-with-moles-part-i/