c# - 使用 Microsoft EntityFramework 进行单元测试

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

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

登录 View 模型.cs

private object dbContext = new S_ERP_DBEntities();

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

单元测试1.cs

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

那会起作用,但我不知道是否有更优雅的方法。 任何反馈将不胜感激。

谢谢

最佳答案

你所做的实际上是一种非常常见的测试层的方法,它被称为Dependency Injection .为了让它稍微优雅一些​​,您可以使用默认构造函数将 dbContext 初始化为运行时所需的任何值:

private object dbContext;

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

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

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

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

关于c# - 使用 Microsoft EntityFramework 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33470013/

相关文章:

c# - x :Bind ViewModel method to an Event inside DataTemplate

java - ANT Jenkins 单元测试 - 计算失败的测试

javascript - 使用 Mocha 混契约(Contract)步和异步测试

.net - Entity Framework 6 和 TPH 继承 : Map properties with the same name to same column by default

entity-framework - 有没有人有一个非常完整的 EF 6.1 示例通用存储库?

sqlite - Entity Framework 6 dbcontext sqlite

c# - 了解 C# 中的属性

c# - 比较字符串

c# - Unity - Vector3.MoveTowards 不以恒定速度移动

python - 单元测试中的自定义异常