Mit AutoFixture mit dem AutoFixture.AutoMoq Paket, ich Tests manchmal finden, die nicht richtig konfiguriert wurde, um die Sache zu testen sie zu testen gemeint, aber das Problem wurde nie wegen der Standard (losen) Mock Verhalten entdeckt:Wie kann ich AutoMoqCustomization Strict MockBehavior verwenden?
public interface IService
{
bool IsSomethingTrue(int id);
}
void Main()
{
var fixture = new Fixture()
.Customize(new AutoMoqCustomization());
var service = fixture.Freeze<Mock<IService>>();
Console.WriteLine(service.Object.IsSomethingTrue(1)); // false
}
Ich möchte, dass Mocks mit Strict-Verhalten erstellt werden, also müssen wir Setup()
für die Methoden anrufen, von denen wir erwarten, dass sie aufgerufen werden. Ich kann, wie dies für jeden einzelnen Mock dies tun:
fixture.Customize<Mock<IService>>(c => c.FromFactory(() => new Mock<IService>(MockBehavior.Strict)));
aber nach AutoMoqCustomization durch Quellcode Kämme() und die verschiedenen ISpecimenBuilder
und andere Implementierungen, bin ich ziemlich in Bezug auf die beste Art und Weise verliert nur alle machen Mocks werden mit striktem Verhalten initialisiert. Das Framework scheint sehr flexibel und erweiterbar zu sein, also bin ich sicher, dass es einen einfachen Weg dafür gibt - ich kann einfach nicht herausfinden, wie.
Danke für das Feedback. Ich werde sehen, ob ich es zum Laufen bringen kann. In Bezug auf strenge Mocks: Wenn die Mocks wirklich "Mocks" waren, denke ich, dass Ihr Punkt gültig ist. Unglücklicherweise dienen die meisten meiner Mocks tatsächlich dem Zweck von * Stubs *, von denen erwartet wird, dass sie einen Wert zurückgeben. Wenn das SUT auf Daten zurückgreift, die von dem Stub zurückgegeben werden, und ich den Stub nicht eingerichtet habe, wird der Test im besten Fall fehlschlagen, und im schlimmsten Fall wird der Test aus dem falschen Grund bestanden. In beiden Fällen würde ich lieber sofort die Codezeile sehen, die anzeigt, welcher Stub konfiguriert werden muss, anstatt daraus zu schließen, woher der NRE kommt. – StriplingWarrior
@StriplingWarrior http://blog.ploeh.dk/2013/10/23/mocks-for-commands-stubs-for-queries –
Ich finde das Beispiel dieses Artikels, um ziemlich künstlich zu sein: Brechen CQS, um ein Benutzerobjekt zu schaffen und zurückzubringen Das hat nicht die ID, die der GetUser-Methode bereitgestellt wird.Das sind nicht die Arten von Änderungen, die ich normalerweise bei Methoden sehe. Die Änderungen, die ich regelmäßig sehe, würden sowieso eine Änderung des Komponententests erforderlich machen, obwohl sie wie das letzte korrekte Beispiel in diesem Artikel geschrieben sind. Wenn dies passiert, finde ich, dass das schnelle Verhalten von Strict Mocks viel Zeit spart und - was noch wichtiger ist - hilft, sicherzustellen, dass meine Komponententests testen, was sie angeblich testen. – StriplingWarrior