实体框架上下文实现接口

时间:2017-06-12 11:06:34

标签: c# entity-framework mocking undefined-reference

我有一个实现简单界面的Entity Framework上下文。它们都存在于Data类库中,该库由另一个Core类库引用。数据库引用了Entity Framework 6,所有EF特定代码都存在于那里。系统的其他任何部分都没有EF参考。

我刚刚介绍了这个接口,允许我模拟出一个数据库连接并开始对这两个库进行单元测试,但我很难用新接口替换具体的类。这样做的尝试告诉我,我错过了核心库中的实体框架参考,我宁愿避免使用。

应用(核心库)

// Not actual code, but 
public App()
{
    AppContext c = new AppContext(); // No errors, compiles and runs
    IAppContext i = new AppContext(); // Doesn't compile, unreferenced assembly
 }

确切错误是CS0012 - 类型' DbContext'在未引用的程序集中定义。您必须添加对程序集' EntityFramework'。

的引用

我很难理解为什么只有在我指定的变量属于接口而不是具体类型时才会出现此错误。界面设置非常简单,并且不会引入任何EF引用。

接口和实施(数据库)

// IAppContext.cs
public interface IAppContext
{
    DbSet<Project> Projects { get; set; }
    // A few more DbSets

    int SaveChanges();
}

// AppContext.Interface.cs
public partial class AppContext : IAppContext
{ }

预期的模拟使用

// TestContext.cs
public class TestContext : IAppContext
{
    // Mock up DbSets using Moq or equivalent
}

最终,这个库无论如何都不负责实例化上下文,它将作为构造函数参数传入。我仍然想知道为什么这个特殊的设置会引发这个错误,但这对我没有任何意义。

我创建了一个具有相同行为的最小项目,包括上面列出的代码,以及一个替换Context的空类,它继承了System.Data.Entity.DbContext,并实现了IAppContext。数据库仅添加EntityFramework Reference。核心库仅引用数据库。

虽然稍微偏离主题,如果我在这里走向完全错误的方向,并且有更好的方法来嘲笑这个,我全都耳朵!这是我过去嘲笑EF上下文的方式,尽管这是一个小项目,其中所有内容都在一个程序集中。

0 个答案:

没有答案