Sto deridendo un DbContext
e i suoi DbSet
come descritto qui .
Vorrei creare un metodo di utilità per creare i miei finti DbContext
, che imposta ciascuno dei DbSet
del contesto per restituire un elenco vuoto di default (altrimenti ricevo errori sui riferimenti null ogni volta che provo a interrogare uno dei DbSet
). Quindi nei test unitari in cui desidero dati non vuoti in un determinato DbSet
, desidero richiamare nuovamente il programma di Setup
su quel DbSet
per fornire quel valore di quello che desidero restituire. Il codice è sotto.
L'ho fatto in un test unitario e sembra funzionare, ma non riesco a trovare nulla su come Moq gestisce due volte la chiamata al programma di Setup
sulla stessa proprietà. Lo sta facendo bene o avrà effetti collaterali inaspettati? Usando il debugger, ho esaminato il context.Setups
. Setup
, e chiamando Setup
una seconda volta sulla stessa proprietà aggiunge un secondo oggetto a Setups
piuttosto che sovrascrivere il primo, il che mi preoccupa.
[TestClass]
public class MyTests
{
// Creates a new Mock<MyContext> and calls Setup on each property so
// that they all return empty lists
private Mock<MyContext> CreateContext()
{
Mock<MyContext> context = new Mock<MyContext>();
// CreateMockDbSet is a utility method which creates a Mock<DbSet<TEntity>>
// as described in the MSDN article listed above
context.Setup(e => e.Customers).Returns(CreateMockDbSet<Customer>().Object);
context.Setup(e => e.Orders).Returns(CreateMockDbSet<Order>().Object);
return context;
}
[TestMethod]
public void MyTest()
{
// By default, context.Customers and context.Orders will both return
// empty DbSets
Mock<MyContext> context = CreateContext();
List<Order> orders = new List<Order>
{
new Order { Id = 1 },
new Order { Id = 2 },
new Order { Id = 3 }
};
// CreateMockDbSet creates a Mock<DbSet<Order>> which returns the orders
// in 'orders'. What does Moq do when I call Setup again on 'Orders'?
context.Setup(e => e.Orders).Returns(CreateMockDbSet(orders).Object);
// ... Do test ...
}
}
https://msdn.microsoft.com/en-us/library/dn314429(v=vs.113).aspx
Se si crea un'installazione successiva su un metodo ed è non condizionale (nessun vincolo sugli argomenti), rimuove tutte le impostazioni precedenti per il metodo.
Nel tuo caso in cui non hai un metodo che accetta argomenti, ovviamente non puoi aggiungere alcun vincolo su di essi, quindi la tua configurazione successiva sostituirà semplicemente la precedente.
Vedi questa risposta per una spiegazione del codice sorgente.