Frage

Dies ist eine schwierige Frage , weil nicht zu viele Leute nutzen Pex & Moles oder so glaube ich (obwohl Pex ein wirklich tolles Produkt ist - viel besser als jede andere Einheit Test-Tool)

Ich habe ein Daten Projekt, das mit nur einer Einheit (DBItem) ein sehr einfaches Modell hat. Ich habe auch eine DBRepository in diesem Projekt, dass manipuliert dieses EF-Modell geschrieben. Repository hat eine Methode namens GetItems(), dass gibt eine Liste der Business-Schicht Elemente (BLItem) und sieht ähnlich aus diesem (vereinfachtes Beispiel):

public IList<BLItem> GetItems()
{
    using (var ctx = new EFContext("name=MyWebConfigConnectionName"))
    {
        DateTime limit = DateTime.Today.AddDays(-10);
        IList<DBItem> result = ctx.Items.Where(i => i.Changed > limit).ToList();
        return result.ConvertAll(i => i.ToBusinessObject());
    }
}

So, jetzt würde Ich mag einige Unit-Tests für diese spezielle Methode erstellen. Ich bin mit Pex & Moles . Ich habe meine Mole und Stubs für meinen EF Objektkontext.

Ich mag parametrisierte Unit-Test schreiben (ich weiß, ich habe meinen Produktionscode zuerst geschrieben, aber ich musste, da ich die Prüfung Pex & Moles), dass die Tests, dass diese Methode zurückgibt gültige Liste der Elemente.

Dies ist mein Test-Klasse:

[PexClass]
public class RepoTest
{
    [PexMethod]
    public void GetItemsTest(ObjectSet<DBItem> items)
    {
        MEFContext.ConstructorString = (@this, name) => {
             var mole = new SEFContext();
        };

        DBRepository repo = new DBRepository();
        IList<BLItem> result = repo.GetItems();

        IList<DBItem> manual = items.Where(i => i.Changed > DateTime.Today.AddDays(-10));

        if (result.Count != manual.Count)
        {
            throw new Exception();
        }
    }
}

Dann laufe ich Pex Explorations für diesen speziellen parametrisierte Unit-Test, aber ich erhalte eine Fehlermeldung Pfad Grenzen überschritt . Pex beginnt diesen Test durch null dieses Testverfahren bereitstellt (so items = null). Dies ist der Code, dass Pex ausgeführt wird:

[Test]
[PexGeneratedBy(typeof(RepoTest))]
[Ignore("the test state was: path bounds exceeded")]
public void DBRepository_GetTasks22301()
{
    this.GetItemsTest((ObjectSet<DBItem>)null);
}

Dies war zusätzlicher Kommentar zur Verfügung gestellt von Pex:

Der Testfall lief zu lang für diese Eingänge und Pex gestoppt, um die Analyse. Bitte beachten Sie: Die Methode Oblivious.Data.Test.Repositories.TaskRepositoryTest.b__0 50 Mal aufgerufen wurde; Bitte überprüfen Sie, dass der Code nicht in einer Endlosschleife oder Rekursion stecken. Andernfalls klicken Sie auf 'Set maxstack = 200', und führen Sie Pex wieder.

Update Attribut [PexMethod (maxstack = 200)]

Frage

Bin ich tun dies die richtige Art und Weise oder nicht? Soll ich EFContext Stub stattdessen verwenden? Muss ich zusätzliche Attribute Testmethode hinzufügen, um so Moles Host ausgeführt werden soll (ich bin nicht sicher, ob es funktioniert jetzt). Ich laufe nur Pex & Moles. Kein VS-Test oder nUnit oder irgendetwas anderes.

Ich glaube, ich sollte wahrscheinlich eine Grenze zu Pex gesetzt, wie viele Elemente sollte es für diesen speziellen Testverfahren liefern.

War es hilfreich?

Lösung

Moles ist nicht die Teile der Anwendung zu testen entworfen, die externen Abhängigkeiten (z Dateizugriff, Netzwerkzugriff, Datenbankzugriff, etc.). Stattdessen Moles können Sie diese Teile Ihrer App verspotten, so dass, wie Sie echte Unit-Tests auf die Teile tun können, die keine externen Abhängigkeiten verfügen.

Also ich denke, Sie sollten nur Ihre EF Objekte und Abfragen verspotten, beispielsweise durch In-Memory-Listen erstellen und mit Abfragemethoden zurückgeben gefälschte Daten aus diesen Listen basierend auf, was Kriterien relevant ist.

Andere Tipps

Ich bin gerade in dem Griff bekommen mit PEX auch ... meine Probleme umgaben ich will, es zu benutzen mit moq;)

sowieso ...

Ich habe einige Methoden ähnlich wie Ihr, die das gleiche Problem haben. Wenn ich die max erhöht gingen sie weg. Vermutlich PEX wurde davon überzeugt, dass es die Zweige ausreichend erforscht hatte. Ich habe Methoden, wo ich auch auf dem Code-Vertrag Validierung das Timeout erhöhen musste.

Eine Sache, die Sie wahrscheinlich sein doign sollte jedoch in allen vorbei ist, die abhängigen Objekte als Parameter ... also tun sie nicht instantiate die Repo in der Methode, sondern geben es aus.

Ein allgemeines Problem, das Sie haben, ist, dass Sie große Objekte in Ihrer Methode instanziieren. Ich mache das gleiche in meinen DAL-Klassen, aber dann tryign ich bin nicht zu Unit-Test sie in Isolation. Ich Datensätze aufbauen und nutze diese gegen meinen Datenzugriffscode zu testen.

Ich verwende PEX auf meine Business-Logik und Objekte.

Wenn ich meine DAL-Code-ID, um zu versuchen und zu testen Sie haben IOC verwenden, um die Datacontext in die Methoden zu übergeben - die dann machen würde Testen möglich, wie Sie den Datenkontext verspotten.

Sie sollten Entity Framework Repository-Muster verwenden: http://www.codeproject.com/ KB / database / ImplRepositoryPatternEF.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top