Je crée Entity Framework ObjectContext par demande d'ASP.NET en utilisant le code suivant:Test Entity Framework Unité ObjectContext dans l'application ASP.NET
public static class ObjectContextPerRequest
{
public static EStudyTestDatabaseEntities Context
{
get
{
var _context = HttpContext.Current.Items["EStudyModel"] as EStudyTestDatabaseEntities;
if(_context == null)
{
_context = new EStudyTestDatabaseEntities();
HttpContext.Current.Items.Add("EStudyModel", _context);
}
return _context;
}
}
public static void RemoveContext()
{
var _context = HttpContext.Current.Items["EStudyModel"] as EStudyTestDatabaseEntities;
if(_context != null)
{
_context.Dispose();
}
}
}
Dans le référentiel je l'utilise comme ceci:
public class RoleRepository : IRoleRepository
{
public IList<Role> GetAll()
{
using(var db = ObjectContextPerRequest.Context)
{
return db.RoleSet.ToList();
}
}
}
Cela fonctionne très bien si j'exécute l'application. Le problème est de savoir comment je vais tester le Repository car j'ai besoin de créer un HttpContext.
[TestFixture]
public class when_getting_all_roles
{
[Test]
public void should_get_roles_successfully()
{
var repository = new RoleRepository();
Assert.AreNotEqual(4,repository.GetAll());
}
}
MISE À JOUR:
Je peux faire l'interface IObjectContextPerRequest et ObjectContextPerRequest comme indiqué ci-dessous:
public interface IObjectContextPerRequest
{
EStudyTestDatabaseEntities Context { get; }
void RemoveContext();
}
Et maintenant, je peux écrire mon test comme suit:
[TestFixture]
public class when_getting_all_roles
{
[Test]
public void should_get_roles_successfully()
{
var objectContextPerRequestStub = MockRepository.GenerateStub<IObjectContextPerRequest>();
objectContextPerRequestStub.Expect(x => x.Context).Return(new EStudyTestDatabaseEntities());
var repository = new RoleRepository(objectContextPerRequestStub);
Assert.AreNotEqual(4,repository.GetAll());
}
}
C'est à peu près ce que je fini par faire! Dans une application réelle, je tirerais parti de la puissance du conteneur IOC. – azamsharp