Dan*_*ose 4 c# unit-testing fakeiteasy
我有一个我正在测试的方法.给定某些输入,它应该向记录器(ILogger)写入失败方法.该接口有几个Log()重载,以及一些属性(例如日志记录级别).我正在使用FakeItEasy嘲笑记录器.
我想断言的是发生了对Log()的调用.但是,我不关心使用了哪个特定的重载.我怎样才能做到这一点?
我的想法:
// Doesn't work, since a different overload (with more parameters) is used.
A.CallTo(() => mockLogger.Log(null)).WithAnyArguments().MustHaveHappened();
// "Works", but if the code were to call something else on the logger
// (ex. change the logging level), this would also pass!
Any.CallTo(mockLogger).MustHaveHappened();
Run Code Online (Sandbox Code Playgroud)
编辑
这可以使用以下语法完成:
A.CallTo(logger).Where(x => x.Method.Name == "Log").MustHaveHappened()
Run Code Online (Sandbox Code Playgroud)
原始答案
没有简单的方法可以做到这一点,并且 - 如果我错了,请纠正我 - 我认为没有任何模拟框架.
话虽如此,下面的例子中提供的方法并不那么容易.
public interface ILogger
{
void Log(string value);
void Log(object value);
}
public class LoggerTests
{
public void FakeGetCallsExample()
{
var logger = A.Fake<ILogger>();
logger.Log("whatever");
var callsToLog = Fake.GetCalls(logger).Where(x => x.Method.Name.Equals("Log"));
// Asserting with NUnit.
Assert.That(callsToLog(), Is.Not.Empty);
}
// The following does not work as of now but I'll seriously consider
// implementing it:
public void AnyCallToWithCallSpecificationExample()
{
var logger = A.Fake<ILogger>();
logger.Log("whatever");
// I would add a "filtering" method to the Any.CallTo-syntax:
Any.CallTo(logger).WhereCallMatches(x => x.Method.Name.Equals("Log")).MustHaveHappened();
// It would also enable an extension method:
Any.CallTo(logger).ToMethodNamed("Log").MustHaveHappened();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3449 次 |
| 最近记录: |