我目前有一个小的个人项目,我想从右脚开始,这意味着确保我的功能经过单元测试。
我的应用程序通常使用数据上下文 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_DBEntities
和 Test_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/