c# - 断言该方法已使用 xUnit 调用
问题描述
我有一个带有要测试的日志记录方法的类。例如,我想检查该Console.WriteLine
方法是否已被调用。这是我的示例类
public class MyClass
{
public void LogSomething()
{
Console.WriteLine("Test");
}
}
及其测试
public class MyClassTests
{
[Fact]
public void LogsSomething()
{
MyClass myClass = new MyClass();
myClass.LogSomething(); // Assert that Console.WriteLine has been called once
}
}
有什么我可以使用的吗?(最好没有额外的包装)
我正在寻找这样的断言(伪代码)
Assert.Method(Console.WriteLine).ToHaveBeenCalledWith(myClass.LogSomething);
Assert.Method(Console.WriteLine).ToHaveBeenCalledWith(myClass.LogSomething).Times(3); // Check if Console.WriteLine has been called 3 times (loop inside the LogSomething method)
解决方案
我认为您不能开箱即用地断言。
您最好的选择是使用Moq
或其他模拟框架来执行此操作。您应该始终以使用依赖注入的解耦逻辑为目标,否则您最终将拥有一个难以测试的紧密耦合代码,并且每当需求发生变化时也不容易重构
public interface ILogger
{
public void Log();
}
public class Logger: ILogger
{
public void Log()
{
Console.WriteLine("Look mom, i'm logging");
}
}
public class MyClass
{
private readonly ILogger Logger
public MyClass(ILogger logger)
{
Logger = logger;
}
public void MyMethod()
{
//other code
Logger.Log();
}
}
public class MyClassTests
{
[Fact]
public void LogsSomething()
{
//arrange
var logger = new Mock<ILogger>();
//act
var sut = new MyClass(logger.Object);
sut.MyMethod();
//Assert
logger.Verify(foo => foo.Log(), Times.Once()); //here
//some other assertions
}
}
推荐阅读
- c++ - 函数模板和模糊模板参数
- angular - 如何使用 Heroku 上托管的 Angular App 修复 CORS?
- c++ - 如何确保在 qt 进程中实际完成 mount 命令
- html - 如何在使文本 100% 可见的同时降低背景图像的不透明度?
- angular - 当我刷新页面时,我返回主页
- swift - 如何使用 Metal Framework 在 iOS Swift 中绘制文本
- jquery - 如何选择具有特定类且以类结尾的元素?
- php - 使用队列生成 pdf 有时会显示旧设计,有时会显示新设计
- mongodb - 数据库中不那么紧急的字段我应该填写什么?
- mysql - mariadb-server 已被 mysql-community-server 淘汰