Testen mit Effort- und TypeName-Attribut

c# dbcontext effort entity-framework unit-testing

Frage

Ich möchte etwas Code testen, und um das zu erreichen, müsste ich DbContext fälschen, der in DAL definiert ist ( Entity Framework 6 - Code first ). Es läuft meistens gut, aber ich stieß auf ein Problem, wenn die Datenmodellklasse das TypeName Attribut verwendet. Ich machte ein Skelett, um das Problem zu demonstrieren.

Das Datenmodell:

[Table("Customer")]
public class Customer
{
    [Key]
    public int Id { get; set; }

    public string FirstName{ get; set; }

    public string LastName { get; set; }

    //this line causes the exception
    [Column(TypeName = "money")]
    public decimal Salary { get; set; }
}

Die Kontextdefinition

[Table("Customer")]
public class Customer
{
    [Key]
    public int Id { get; set; }

    public string FirstName{ get; set; }

    public string LastName { get; set; }

    //this line causes the exception
    [Column(TypeName = "money")]
    public decimal Salary { get; set; }
}

Und eine Dummy-Methode, um einen gefälschten Kontext mit einigen Daten zu generieren:

[Table("Customer")]
public class Customer
{
    [Key]
    public int Id { get; set; }

    public string FirstName{ get; set; }

    public string LastName { get; set; }

    //this line causes the exception
    [Column(TypeName = "money")]
    public decimal Salary { get; set; }
}

Das Problem ist das TypeName Attribut. Wenn es auskommentiert wird, bestehen Tests. Aber wenn es aktiviert ist, habe ich eine System.InvalidOperationException ausgelöst und gesagt

Sequenz enthält keine passenden Element

Um es zusammenzufassen, meine Fragen sind:

  • Gibt es einen Weg, wie ich Aufwand in den Tests nutzen könnte, selbst wenn die Datenmodellklasse Attribute hat
  • Wenn nicht, welche alternative Methode sollte ich wählen, um einen gefälschten DbContext zu erstellen?

Akzeptierte Antwort

Ich würde Ihnen empfehlen, sich EntityTypeConfigurations anzuschauen und Ihre Mappings dorthin zu verschieben: http://www.entityframeworktutorial.net/code-first/entitytypeconfiguration-class.aspx

Es ermöglicht Ihnen, Ihre aktuelle verwendete Datenbank nicht zu berücksichtigen und Ihre Entitäten / Schnittstellen zu testen, ohne sie mit Entity Framework zu berücksichtigen.

Es sieht auch so aus, dass Sie Integrationstests anstelle von Komponententests durchführen. Um Komponententests durchzuführen, sollten Sie die echte DbContext-Verwendung loswerden (Ihre aktuelle Implementierung verwendet eine konkrete EF-Implementierung für DAL, sollte aber stattdessen eine Abstraktion verwenden).

Ich würde empfehlen, dass Sie Ihren DbContext zumindest in eine Oberfläche einbinden, damit Sie ihn besser machen / stupsen können:

public interface IDbContext {
      IDbSet<Customer> Customers { get; set; }
}



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum