Test con attributo Effort e TypeName

c# dbcontext effort entity-framework unit-testing

Domanda

Mi piacerebbe testare un po 'di codice, e per riuscirci, avrei bisogno di simulare DbContext definito in DAL ( Entity Framework 6 - Code first ). Sta andando per lo più bene, ma mi sono imbattuto in un problema quando la classe del modello di dati sta usando l'attributo TypeName . Ho fatto uno scheletro per dimostrare il problema.

Il modello dati:

[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; }
}

La definizione del contesto

[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; }
}

E un metodo fittizio per generare un contesto falso con alcuni dati:

[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; }
}

Il problema è l'attributo TypeName . Quando viene commentato, i test passano. Ma se è abilitato, ho lanciato un System.InvalidOperationException , dicendo

La sequenza non contiene elementi corrispondenti

Per riassumere, le mie domande sono:

  • c'è un modo in cui potrei usare Effort nei test anche se la classe del modello di dati ha attributi
  • in caso contrario, quale metodo alternativo dovrei utilizzare per creare un DbContext falso?

Risposta accettata

Ti consiglierei di dare un'occhiata a EntityTypeConfigurations e spostare i tuoi mapping lì: http://www.entityframeworktutorial.net/code-first/entitytypeconfiguration-class.aspx

Vi consentirà di non prendere in considerazione il vostro DB corrente utilizzato e testare le vostre entità / interfacce che li utilizzano senza prendere in considerazione Entity Framework.

Mi sembra anche che tu stia facendo test di integrazione invece di test unitari. Per eseguire test unitari, è necessario eliminare l'utilizzo reale di DbContext (l'implementazione corrente utilizza un'implementazione EF concreto per DAL, ma dovrebbe invece utilizzare un'astrazione).

Raccomanderei di avvolgere il tuo DbContext almeno in un'interfaccia in modo che tu possa prenderlo in giro / stublo in un modo migliore:

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché