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
public class MyDbContext : DbContext
{
public MyDbContext(string nameOrConnectionString) : base(nameOrConnectionString)
{
}
public MyDbContext(DbConnection connection) : base(connection, true)
{
}
public IDbSet<Customer> Customers { get; set; }
}
E un metodo fittizio per generare un contesto falso con alcuni dati:
private MyDbContext GenerateFakeDbContext()
{
var connection = DbConnectionFactory.CreateTransient();
var context = new MyDbContext(connection);
var customer = new Customer
{
Id = 1,
FirstName = "X",
LastName = "Y",
Salary = 1000
};
//this line throws the exception
context.Customers.Add(customer);
return context;
}
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:
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; }
}