Ich lese eine Menge Dokumentation und Beispiele darüber, wie man Unit-Tests richtig kombiniert, indem man die drei Komponenten im Titel kombiniert. Ich habe eine Testmethode für meine Geschäftslogik entwickelt, aber sie fühlt sich sehr klobig und dreckig an.XUnit, AutoFixture und Moq Best Practice
Ich möchte gerne Feedback von Leuten bekommen, die mehr über dieses Thema erfahren haben, um zu sehen, wie ich es verbessern kann.
Hier ist der Code, Erklärung folgt:
[Fact]
public void ShouldGetItemWithSameId()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var facade = fixture.Freeze<Mock<IDataFacade>>();
facade.Setup(c => c.Get(It.IsAny<int>())).Returns((int i) => new Item { Key = i });
var sut = fixture.Create<BusinessLogic>();
var expected = fixture.Create<int>();
Assert.Equal(expected, sut.Get(expected).Key);
}
Meine BusinessLogic
Klasse nimmt ein IDataFacade
als Konstruktor-Parameter, der in seinen Get(int)
Verfahren zuständig ist das Element mit der gleichen Id, ziemlich einfach Sachen zu holen.
Ich friere die IDataFacade
Mock ein und ich habe es eingerichtet, um ein Objekt mit der ID in It.IsAny<int>
zu konstruieren. Ich erstelle dann mein SUT und teste es. Funktioniert gut.
Ich mag würde zu verstehen, wenn ich die Dinge verbessern kann unter Berücksichtigung der folgenden:
- Ich habe komplexere Methoden zu testen, wie ein
Query
Methode, die eine Klasse enthält eine Menge Eigenschaften nimmt die verwendet wird, als Filter für übereinstimmende Eigenschaften des abgefragten Typs. In diesem Fall würde ich nicht wissen, wie man den "Setup" -Teil des Mocks richtig macht, da ich alle oder fast alle Eigenschaften des zurückgegebenen Typs initialisieren muss, und in diesem Szenario ist es kein einzelnes Item eine ganze Sammlung - Die Setup-Teil fehl am Platz fühlt, würde ich mag es wiederzuverwenden in mehr Methoden
ich habe in der Lage sein, einige anderen Tests mit Theory
mit AutoMoqData
aber ich war nicht in der Lage, diesen Test zu erreichen (und ich denke, die komplexeren) mit diesem Ansatz, so wechselte ich wieder auf Ebene Fact
mit manuell instanziierten Fixture.
Jede Hilfe wird sehr geschätzt.
Habt Ihr (Auto) NSubstitute in Betracht gezogen - Ich habe zu lange an meiner 'Was ist falsch mit Moq' Haltung festgehalten. http://weareadaptive.com/blog/2014/09/30/why-nsubstitute/ –