5

我正在抽象我的 DbContext 以尝试解决关注点分离并使我的代码可单元测试。为了做到这一点,我想出了以下界面。

下面的这个接口托管在名为AllInterfaces的程序集中。由于下面声明中的 IDbSet,该项目引用了 EF dll。

public interface ISalesContext : IDisposable   
{   
  IDbSet<Customer> Customers { get; }   
  IDbSet<Order> Orders { get; }   
  IDbSet<Product> Products { get; }    
}    

我还创建了一个假数据库集,如下所示。

public class FakeDataSet<T> : IDbSet<T> where T: class, new()
{
 .......
}

所以对于我的客户对象,这个假数据集如下所示。

public class FakeCustomerDbSet : FakeDbSet<Customer>
    {
     ..............
    }

然后我创建了我的假上下文,如下所示。

public class FakeSalesContext : ISalesContext 
    {
        public FakeSalesContext ()
        {
            Customers = new FakeCustomerDbSet ();

        }

        public IDbSet<Customer> Customers { get; set; }
        public IDbSet<Order> Orders{ get; private set; }
        public IDbSet<Product> Products { get; private set; }

        public void Dispose()
        {

        }
    }

与假对象相关的所有上述类(FakeDataSet、FakeCustomerDbSet 和 FakeSalesContext)都存在于程序集AllFakes中。我必须添加对 EF dll 的引用,因为这些假类中也引用了 IDbSet 接口。

然后我有我的单元测试项目,我在其中使用假对象来执行单元测试。

ISalesContext Context = new FakeSalesContext ();
Context.Customers.Add(new Customer() { Id = 1, LastName = "Karen" } );

问题是这个单元测试需要我添加对实体框架 dll 的引用。如果我删除 EF 引用,我会收到以下编译错误。

类型“System.Data.Entity.IDbSet`1”在未引用的程序集中定义。您必须添加对程序集“EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”的引用。

如果我从 AllFakes 程序集中删除 EF dll 引用,我会收到以下错误。

找不到类型或命名空间名称“IDbSet”(您是否缺少 using 指令或程序集引用?)

向所有这些程序集添加对 EF dll 的引用是否有意义?对我来说,因为我已经抽象了我的数据库上下文,所以这里不需要它。关于如何做到这一点的任何建议?

4

2 回答 2

2

我相信您需要参考 EF dll。您确实抽象了您的上下文,但您的抽象仍然使用在 EntityFramework.dll 中定义的 IDbSet 接口。如果您不添加对 EntityFramework.dll(定义 IDbSet 的位置)的引用,FakeSalesContext 会公开 IDbSet 类型的公共属性,因为编译器不知道 IDbSet 是什么,因此无法编译。

于 2012-10-08T17:16:40.450 回答
1

在这种情况下,我认为它没有问题。只要您只是测试您的DbContext实现,引用本身仅用于您的上下文对象的依赖解析。

于 2012-10-08T17:17:17.977 回答