gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:33:02 27 4
gpt4 key购买 nike

我正在抽象我的 DbContext 以尝试解决关注点分离并使我的代码可进行单元测试。为此,我提出了以下界面。

下面这个接口(interface)托管在名为 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 接口(interface)。

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

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

问题是这个单元测试需要我添加对 Entity Framework dll 的引用。如果删除 EF 引用,则会出现以下编译错误。

The type 'System.Data.Entity.IDbSet`1' is defined in an assembly that is not referenced. You must add a reference to assembly 'EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.

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

The type or namespace name 'IDbSet' could not be found (are you missing a using directive or an assembly reference?)

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

最佳答案

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

关于c# - 当抽象上下文时,单元测试项目是否应该引用 EF dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12786254/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com