我在一个方法中使用此代码进行单元测试
public void SomeMethod()
{
IMyLogger log = new Logger();
log.ConfigLogger(); // Trying to not call this method
//...some other code...
}
这是Logger类
public class Logger : IMyLogger
{
public void ConfigLogger()
{
//Serilog logging code I´m trying to not call in my unittests.
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.CreateLogger();
}
}
这是我的单元测试,我试图模拟掉(不要在没有运气的情况下调用ConfigLogger()方法中的代码。
public void Test()
{
var logger = A.Fake<IMyLogger>();
A.CallTo(() => logger.ConfigLogger()).DoesNothing(); //Not working..
}
那么我在这里错过了什么?为什么我认为这应该是这样的?即使Serilog专家给我一个更好的单元测试Serilog的方法,我也想知道如何“FakeItEasy a void method”。
答案 0 :(得分:1)
您的生产代码仍在使用Logger
的具体实例。除了FakeItEasy创造的假货之外,FakeItEasy不会影响任何行为。
使用模式是:
由于您的生产代码现在已经编写,因此没有机会注入协作者 - 它会创建自己的协作者(log
)。为了避免调用Logger
方法,您需要提供一种方法来注入替代IMyLogger
。
答案 1 :(得分:0)
您应该避免在方法中实例化和配置记录器。
像
这样的东西public class SomeClass()
{
IMyLogger log;
public SomeClass(IMyLogger logger)
{
this.log = logger;
}
public void SomeMethod()
{
// code you want to test
}
}
然后将其传递到您正在测试的课程中:
public void Test()
{
var logger = A.Fake<IMyLogger>();
var someClass = new SomeClass(logger);
// test someClass.SomeMethod()
}