Unit testing 如何";跳过“;虚空法和假货法?
我在一个正在进行单元测试的方法中使用了这段代码Unit testing 如何";跳过“;虚空法和假货法?,unit-testing,serilog,fakeiteasy,Unit Testing,Serilog,Fakeiteasy,我在一个正在进行单元测试的方法中使用了这段代码 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() {
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..
}
公共无效测试()
{
var logger=A.Fake();
A.CallTo(()=>logger.ConfigLogger()).DoesNothing();//不工作。。
}
所以我在这里遗漏了什么?为什么我认为这应该是这样的?尽管Serilog专家给了我一个更好的方法来测试Serilog,但我也想知道如何“伪造一个无效的方法” 使用的模式是:
由于您的生产代码现在已经编写完毕,因此没有机会注入协作者—它创建自己的协作者(
log
)。为了避免调用Logger
方法,您需要提供一种方法来插入替代的IMyLogger您应该避免在方法中实例化和配置记录器
差不多
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()
}
公共无效测试()
{
var logger=A.Fake();
var someClass=新的someClass(记录器);
//测试someClass.SomeMethod()
}