gpt4 book ai didi

c# - 防止在单元测试中写入数据库 - .NET MVC/Entity Framework

转载 作者:太空宇宙 更新时间:2023-11-03 12:11:51 24 4
gpt4 key购买 nike

我正在尝试为使用 Entity Framework 的现有 .NET MVC 4.5 Web 应用程序编写单元测试。我想测试 bool 方法是否按预期返回 true/false;然而,被测方法写入数据库日志。

不幸的是,这些测试抛出以下异常:

System.InvalidOperationException: No connection string named 'xxxDbContext' could be found in the application config file.

我不希望修改数据库,而且我正在努力寻找如何模拟此示例中的 `DbContext 的示例。

如何在不实际写入数据库的情况下测试 bool 结果?在下面的示例中,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;
}

谢谢!

最佳答案

你的 LocalFileCompare()方法取决于 Logger类(又名它是“紧密耦合”)。因为执行 Logger写入数据库,调用LocalFileCompare()时无法避免写入数据库除非你删除依赖项。您可以通过使方法依赖于接口(interface)来做到这一点,使 Logger类实现该接口(interface),然后将其“注入(inject)”到 LocalFileCompare() 中方法。

这将允许您通过简单地实现接口(interface)并让实现不写入数据库来轻松创建模拟记录器类。

第 1 步:创建 ILogger界面

第 2 步:更改您的 Logger要实现的类 ILogger

第 3 步:更改您的 LocalFileCompare() 的签名包含 ILogger 的方法参数

第 4 步:添加 Logger所有调用 LocalFileCompare() 的实例方法

第 5 步:使用模拟 ILogger 更新您的测试实现

// Step 1
public interface ILogger
{
void Log(string message);
}

// Step 2
public class Logger : ILogger
{
void Log(string message)
{
// Implementation here
}
}

// Step 3
public bool LocalFileCompare(FileInfo file1, FileInfo file2, ILogger logger)
{
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;
}

// Step 4
// Update your calls to LocalFileCompare()

// Step 5
// Put this somewhere in the Test project
public class MockLogger : ILogger
{
void Log(string message)
{
Console.WriteLine(message);
}
}

// In your test class
ILogger mockLogger;

// In your Test Setup method
mockLogger = new MockLogger();

[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, mockLogger);
Assert.IsFalse(result);
}

关于c# - 防止在单元测试中写入数据库 - .NET MVC/Entity Framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51829638/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com