Ho un progetto ASP.NET MVC, e sto scrivendo il mio servizio qualcosa sulla falsariga di questo:ASP.NET Testing DbContext a metodi locali
public class UserService : IUserService
{
public void AddUser(UserModel userModel)
{
if (ModelState.IsValid){
var user = new User
{
FirstName = userModel.FirstName,
LastName = userModel.LastName,
Email = userModel.Email,
Age = userModel.Age
};
using (var context = new MyDbContext())
{
context.Users.Add(user);
}
}
}
//... More code for service
}
E la mia classe DbContext:
public class MyDbContext : DbContext
{
public MyDbContext(): base("name=mydb"){}
public DbSet<User> Users {get; set;}
//.. More domain objects.
}
Questo funziona bene per la maggior parte, ma il problema sorge quando voglio provare e testarlo. Sto seguendo le linee guida generali here con derisione, ma solo se DbContext è dichiarato come istanza di classe, al contrario di una variabile funzionale. Voglio farlo in questo modo perché mi consente di avere il controllo sulla transazione e sullo smaltimento del contesto. Qualcuno ha qualche suggerimento su come farlo?
mie schernisce sono come questo:
public class UserServiceTest
{
[Fact]
public void TestAddUser()
{
var userSet = GetQueryableMockDbSet(userData.ToArray());
var context = new MyDbContext
{
Users = userSet
};
var userService = new UserService();
userService.AddUser(); // HOW DO I GET CONTEXT IN HERE?
}
private static DbSet<T> GetQueryableMockDbSet<T>(params T[] sourceList) where T : class
{
var queryable = sourceList.AsQueryable();
var dbSet = new Mock<DbSet<T>>();
dbSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(queryable.Provider);
dbSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(queryable.Expression);
dbSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(queryable.ElementType);
dbSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(queryable.GetEnumerator());
return dbSet.Object;
}
}
È necessario passare la vostra 'DbContext' al costruttore del servizio. Leggi su Dependency Injection e usa un contenitore IoC per semplificare le cose –
Non può passare l'istanza al contenitore, poiché ha affermato che vuole controllare la creazione dell'istanza all'interno del metodo. Stavo pensando che OP possa iniettare un 'Factory' nel servizio che creerà l'istanza, e quindi prendere in giro il metodo di creazione Factory con l'oggetto fittizio – 3dd
Il metodo factory sembra promettente: sarebbe qualcosa come FactoryContext.Create() restituisce un Oggetto MyDbContext? Il metodo Create è statico, ovviamente. –