2009-12-16 49 views
2

我每ASP.NET请求使用下面的代码创建实体框架的ObjectContext:单元测试实体框架的ObjectContext在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(); 
      } 
     } 
    } 

在Repository我用这样的:

public class RoleRepository : IRoleRepository 
    { 
     public IList<Role> GetAll() 
     { 
      using(var db = ObjectContextPerRequest.Context) 
      { 
       return db.RoleSet.ToList(); 
      } 
     } 
    } 

这工作正常,如果我运行的应用程序。问题是我将如何单元测试存储库,因为我需要创建一个HttpContext。

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

UPDATE:

我可以让IObjectContextPerRequest接口和ObjectContextPerRequest,如下图所示:

public interface IObjectContextPerRequest 
    { 
     EStudyTestDatabaseEntities Context { get; } 
     void RemoveContext(); 
    } 

现在我可以写出如下我的测试:

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

     } 
    } 

回答

2

你可以定义两个存储库构造函数,并在测试中使用一个,其次是应用程序:

public class Repository 
{ 
    private ObjectContext _ctx; 

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

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

如果您使用IOC容器,您可以只定义一个构造函数,但这更多解释。

随着构造测试将是更容易编写:

[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

这几乎是我落得这样做!在实际应用中,我会利用IOC容器的力量。 – azamsharp 2009-12-17 01:26:06