c# - 测试类 A 中的方法是否已从类中的另一个方法调用

标签 c# unit-testing moq

可以使用 Moq and dependency injection 来测试方法是否被调用.但是,是否可以测试类中的一个方法是否调用同一类中的另一个方法?

例如,我想测试如果我记录了某个异常,是否也会记录一条信息消息。

方法是:

public void Error(string message, Exception exception, long logId = 0)
{
    var int32 = (int)logId;
    Info("Id was converted to an int so that it would fit in the log: " + logId, int32);
    Error(message, exception, int32);
}

这是我对其进行单元测试的尝试。测试失败,有什么办法可以解决吗?

void logging_an_error_with_a_long_id_also_logs_info()
{
    var mock = new Mock<ILogger>();
    var testedClass = new Logger();
    var counter = 0;

    testedClass.Error("test" + counter++, new Exception("test" + counter), Int64.MaxValue);

    mock.Verify(m => m.Info(It.IsAny<string>(), It.IsAny<int>()));
}

由于 InfoError 方法在同一个类 (ClassA) 中,我认为我不能将 ClassA 作为依赖项传递给 ClassA。那么它不需要测试吗?

最佳答案

你能做的最好的事情就是制作 Info virtual .这将允许您创建一个 Mock<Logger> , 设置 CallBase = true ,并验证 Info被调用了。

var mock = new Mock<Logger> 
{
    CallBase = true
};

mock.Object.Error("test" + counter++, new Exception("test" + counter), Int64.MaxValue);

mock.Verify(m => m.Info(It.IsAny<string>(), It.IsAny<int>()));

这样,您仍在调用 Error 的实际实现,但您已使用 Moq 来验证 Info方法被调用。

关于c# - 测试类 A 中的方法是否已从类中的另一个方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31140550/

相关文章:

C# - 图像的高质量字节数组转换

unit-testing - Vue 测试报告器显示预期抛出的错误

c# - 用于单元测试的域模型的接口(interface)/虚拟

c# FileInfo exists 为文件的网络路径返回 false

c# - WCF安全问题

c# - 有没有一种方法可以在 azure 函数启动后立即调用通过依赖项注入(inject)注入(inject)的类中的方法?

java - 单元测试 AEM 6.1 和模拟 sling、Jcr 和 Osgi

javascript - 单元测试传递 Promise 的 Angular 指令表达式属性

unit-testing - 单元测试基础 Controller OnActionExecutionAsync 和 OnActionExecuted 方法

c# - 如何设置基于参数值动态返回结果的模拟?