可以测试是否使用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>()));
}
由于Info
和Error
方法属于同一个类(ClassA),我不相信我可以将ClassA作为依赖项传递给ClassA。那么不需要测试吗?
答案 0 :(得分:7)
您能做的最好的事情就是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
方法。
答案 1 :(得分:5)
感觉就像是在尝试测试错误的东西。从Info
方法调用类Error
方法并不重要,重要的是Info
方法的行为发生了。它是如何发生的是该类的实现细节。
如果我有一个包含两个函数的数学课:
public int Mult(int x, int y) {
return x*y;
}
public int Sqr(int x) {
return Mult(x,y);
}
我不会测试调用Sqr
来调用Mult
函数,我会测试Sqr(4)==16
。如果计算发生在Sqr方法或类的另一种方法中,则无关紧要。
虽然@ Andrew&#39;} solution可能就是你所追求的,嘲笑你正在测试的课程往往导致紧密耦合的脆弱测试。
如果通过观察呼叫的副作用来测试呼叫是不切实际的,那么这可能表明实施可能会使用一些重构。