Moq - Checking-Methode aufrufen, auf der konkreten Klasse
Hier ist ein sehr einfaches Beispiel, was ich versuche zu tun:
public class Bar
{
public void SomeMethod(string param)
{
//whatever
}
}
public interface IBarRepository
{
List<Bar> GetBarsFromStore();
}
public class FooService
{
private readonly IBarRepository _barRepository;
public FooService(IBarRepository barRepository)
{
_barRepository = barRepository;
}
public List<Bar> GetBars()
{
var bars = _barRepository.GetBarsFromStore();
foreach (var bar in bars)
{
bar.SomeMethod("someValue");
}
return bars;
}
}
In meinem test, ich bin mocking IBarRepository Rückkehr eine konkrete Liste definiert in der unit-Tests und übergabe verspottet repository-Instanz an die FooService Konstruktor.
Möchte ich überprüfen, in der FooService Methode GetBars, dass SomeMethod was called für jede der Bars zurück aus dem repository. Ich bin mit Moq. Gibt es eine Möglichkeit, dies zu tun, ohne Spott die Liste der Bars zurück (wenn noch möglich) und nicht, dass einige hacky-flag in Bar (igitt) ?.
Ich bin folgenden ein Beispiel aus einem DDD-Buch, aber ich fange an zu denken, es riecht, da bin ich herausgefordert, den Test der Implementierung....
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überarbeitet... das geht vorbei:
Beachten Sie die geringfügige änderung, Klasse Bar (SomeMethod() ist virtuell). Eine Veränderung, aber nicht mit einem flag... 🙂
Nun, in Bezug auf eine breitere design, gibt es einige Mutationen gehen mit Ihrem bar (was auch immer "SomeMethod()" eigentlich nicht). Das beste, was zu tun wäre wahrscheinlich stellen Sie sicher, dass diese mutation passiert auf jeder Bar zurück aus FooService.GetBars(). Das heißt, richten Sie Ihr repository stub wieder einige bars, und stellen Sie dann sicher, dass alles, was mutation erfolgt durch SomeMethod() stattgefunden hat. Nachdem alle, die Sie Steuern, die Bars, die zurückgegeben werden, so dass Sie einrichten können Ihre pre-SomeMethod () - Zustand, und überprüfen Sie dann Ihre post-SomeMethod() Zustand.
Wenn ich schreiben diese Klassen durch unit-Tests im Hinterkopf, würde ich wahrscheinlich entweder die Klasse
Bar
implementieren eine SchnittstelleIBar
und verwenden Sie die Schnittstelle in meinem Dienst, oder machenSomeMethod
virtuelleBar
.Idealerweise so:
Dann meine unit-test würde wie folgt Aussehen:
DoSomething()
ich hätte Ableitung vonBar
(ist jetzt möglich), wahrscheinlich gewinnt eine Menge von Mitgliedern, die ich möchte nicht. Durch die Kodierung einer Schnittstelle würde ich nur umsetzen müssen, was erforderlich war, eine Reduzierung der Komplexität und nachher macht es einfacher, mit zu arbeiten.INotifier
und vielleicht eine default-Implementierung vonNotifier
, aber es wäre eine Implementierung vonINotifier
genanntEmailNotifier
. Ich fürchte, ich bin verloren, was meinst du Impl postfix. Für die askers Frage, ich sagte lediglich ich würde Ihnen einige-SchnittstelleIBar
,IFoo
, was auch immer es ist, nur entsprechend benanntes und mit denBar
würde, es umzusetzen. Es ist nur ein Beispiel, vielleicht wäre es übersichtlicher gewesen, wenn ich verwendet hatteIFoo
, aber es scheint, bilden Sie eine Frage über dummy-Namen.IFoo
wäre perfekt für mich durchaus akzeptabel, wenn es zur Verfügung gestellt Foo Funktionalität.