2009-12-16 4 views
2

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()); 

     } 
    } 

Répondre

2

Vous pouvez définir deux constructeurs de référentiel et en utiliser un dans les tests, deuxième dans l'application:

public class Repository 
{ 
    private ObjectContext _ctx; 

    public Repository() 
    { 
     _ctx = ObjectContextPerRequest.Context; 
    } 

    public Repository(ObjectContext ctx) 
    { 
     _ctx = ctx; 
    } 
} 

Vous ne pouvez définir qu'un seul constructeur si vous avez utilisé le conteneur IOC, mais c'est beaucoup plus à expliquer.

Avec les tests de constructeurs seront plus faciles à écrire:

[TestFixture] 
public class when_getting_all_roles 
{ 
    [Test] 
    public void should_get_roles_successfully() 
    { 
     var repository = new RoleRepository(new EStudyTestDatabaseEntities()); 
     Assert.AreNotEqual(4,repository.GetAll()); 
    } 
} 
+0

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

Questions connexes