使用Microsoft EntityFramework进行单元测试

时间:2015-11-02 02:53:34

标签: c# unit-testing entity-framework-6

我目前有一个小型的个人项目,我想从右脚开始,这意味着确保我的功能是经过单元测试的。 我的应用程序通常使用数据上下文S_ERP_DBEntities,但在测试时我想将数据上下文更改为Test_S_ERP_DBEntities。 这是我到目前为止,但我真的不确定。默认情况下,视图调用默认构造函数,这意味着在未测试时我有正确的数据上下文,因为默认构造函数不会更改它。

LoginViewModel.cs

private object dbContext = new S_ERP_DBEntities();

    public LoginViewModel(object dbEntities)
    {
        dbContext = dbEntities;
    }

的UnitTest1.cs

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        var dbContext = new Test_S_ERP_DBEntities();
        var login = new LoginViewModel(dbContext);
    }
}

这样可行,但我不知道是否有更优雅的方式。 任何反馈将不胜感激。

由于

1 个答案:

答案 0 :(得分:3)

你在做什么实际上是一种测试图层的常用方法,它被称为Dependency Injection。为了使它更优雅,您可以使用默认构造函数将dbContext初始化为运行时所需的内容:

private object dbContext;

public LoginViewModel()
{
    dbContext = new S_ERP_DBEntities();
}

public LoginViewModel(object dbEntities)
{
    dbContext = dbEntities;
}

这样创建此View Model实例的“真实”对象不必担心初始化dbContext并且可以简单地使用默认构造函数,而单元测试可以调用重载来“注入”依赖”。

作为旁注,我会将dbContext上的类型更改为其实际类型,而不是object。我假设您使用的是object,因为您有两种不同的上下文类型:S_ERP_DBEntitiesTest_S_ERP_DBEntities。这虽然有效,但却是一种代码气味,因为单元测试通常不依赖于数据库。您应该创建一个S_ERP_DBEntities 的模拟(读取:伪造)实例,并在测试视图模型时传递它,而不是创建与数据库进行对话以进行测试的不同上下文。这里要注意的关键是:可以安全地假设Microsoft已经对单元测试过的Entity Framework进行了单元测试,因此您可以安全地模拟它。有关详细信息,请参阅using Mock with Entity Framework上的此链接。