当抽象上下文时,单元测试项目是否应该引用EF dll

ima*_*mak 5 c# unit-testing entity-framework dbcontext

我正在抽象我的DbContext,试图解决Sepalate of Concerns并使我的代码单元可测试.为了做到这一点,我提出了以下接口.

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

public interface ISalesContext : IDisposable   
{   
  IDbSet<Customer> Customers { get; }   
  IDbSet<Order> Orders { get; }   
  IDbSet<Product> Products { get; }    
}    
Run Code Online (Sandbox Code Playgroud)

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

public class FakeDataSet<T> : IDbSet<T> where T: class, new()
{
 .......
}
Run Code Online (Sandbox Code Playgroud)

所以对于我的Customer对象,这个假数据集如下所示.

public class FakeCustomerDbSet : FakeDbSet<Customer>
    {
     ..............
    }
Run Code Online (Sandbox Code Playgroud)

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

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

        }
    }
Run Code Online (Sandbox Code Playgroud)

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

然后我有我的单元测试项目,我使用假对象进行单元测试.

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

问题是这个单元测试要求我添加对Entity framework dll的引用.如果我删除EF引用,我会得到以下编译错误.

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

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

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

向所有这些程序集添加对EF dll的引用是否有意义?对我来说,因为我已经抽象了我的数据库上下文,所以不应该在这里需要它.有关如何实现这一目标的任何建议?

Paw*_*wel 2

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