我目前有一个小型的个人项目,我想从右脚开始,这意味着确保我的功能是经过单元测试的。
我的应用程序通常使用数据上下文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);
}
}
这样可行,但我不知道是否有更优雅的方式。 任何反馈将不胜感激。
由于
答案 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_DBEntities
和Test_S_ERP_DBEntities
。这虽然有效,但却是一种代码气味,因为单元测试通常不依赖于数据库。您应该创建一个S_ERP_DBEntities
的模拟(读取:伪造)实例,并在测试视图模型时传递它,而不是创建与数据库进行对话以进行测试的不同上下文。这里要注意的关键是:可以安全地假设Microsoft已经对单元测试过的Entity Framework进行了单元测试,因此您可以安全地模拟它。有关详细信息,请参阅using Mock with Entity Framework上的此链接。