【发布时间】:2018-08-13 19:51:53
【问题描述】:
我正在尝试为使用实体框架的现有 .NET MVC 4.5 Web 应用程序编写单元测试。我想测试bool 方法是否按预期返回true/false;但是被测试的方法会写入数据库日志。
很遗憾,这些测试抛出以下异常:
System.InvalidOperationException:在应用程序配置文件中找不到名为“xxxDbContext”的连接字符串。
我不希望修改数据库,并且我正在努力寻找如何在此示例中模拟 `DbContext 的示例。
如何在不实际写入数据库的情况下仅测试布尔结果?在下面的示例中,Logger.Log() 向数据库添加了一行,我不希望在单元测试期间修改实际的数据库。
以下是代码的简化示例:
测试方法
[TestMethod]
public void LocalFileCompare_File2IsNull_ReturnsFalse()
{
var t = new tManager(new tSet());
FileInfo file1 = new FileInfo(@"C:\Temp\TempFile.txt");
FileInfo file2 = null;
var result = transferSet.LocalFileCompare(file1, file2);
Assert.IsFalse(result);
}
待测方法
public bool LocalFileCompare(FileInfo file1, FileInfo file2)
{
if (file1 == null || file2 == null)
{
Logger.Log("LocalFileCompare: One or both files are null.");
return false;
}
if (file1.FullName != file2.FullName)
{
Logger.Log($"LocalFileCompare - file names don't match.");
return false;
}
if (file1.Length != file2.Length)
{
Logger.Log($"LocalFileCompare - file sizes don't match.");
return false;
}
return true;
}
谢谢!
【问题讨论】:
-
什么是
Logger? -
注入标记的记录器或使用编译器宏为记录器编写不同的方法
-
@Steve 我在回答中解释了“注入”方法。
-
你可以使用 Moq 来模拟你的数据库 - 它非常好 -> spin.atomicobject.com/2017/08/07/intro-mocking-moq
-
@DanielLoudon 模拟数据库是为了集成测试。单元测试应该全部在内存中运行,没有外部依赖。
标签: c# entity-framework unit-testing moq