AutoFixture:提供一个函数作为构造函数参数
本文关键字:函数 一个 参数 构造函数 AutoFixture | 更新日期: 2023-09-27 18:15:14
我对单元测试很陌生,我正在用xUnit和AutoFixture做一些实验。
这是我要测试的类的构造函数:
public PokerClientIniGenerateCommand(
Func<TextWriter> writerCreator,
FranchiseInfo franchise)
{
// some code here
}
我正在做这个:
public abstract class behaves_like_poker_client_ini_generate_command : Specification
{
protected PokerClientIniGenerateCommand commandFixture;
protected behaves_like_poker_client_ini_generate_command()
{
var fixture = new Fixture();
commandFixture = fixture.Create<PokerClientIniGenerateCommand>();
}
}
我不确定如何设置构造函数参数(主要是第一个参数-函数部分)。
在我的业务逻辑中,我像这样实例化这个类:
new PokerClientIniGenerateCommand(
() => new StreamWriter(PokerClientIniWriter),
franchise));
所以在我的测试中,我应该这样调用函数:
() => new StringWriter(PokerClientIniWriter)
但是我怎么能通过AutoFixture设置这个呢?如有任何帮助,将不胜感激。
从2.2及以上版本开始,AutoFixture自动处理Func
和Action
委托。
在您的示例中,您只需要将StringWriter
类型注入为TextWriter
类型,如下所示:
fixture.Inject<TextWriter>(new StringWriter());
您可以在这里阅读更多关于Inject
方法的信息
正如@NikosBaxevanis在他的回答中正确指出的,AutoFixture能够创建任何委托类型的匿名实例。这些匿名委托采用动态生成方法的形式。
当前实现的生成策略遵循以下规则:
- 如果委托的签名是
void
,创建的方法将是a操作来。 - 如果委托的签名有一个返回值
T
,创建的方法将返回一个T
的匿名实例。
Func<TextWriter>
的情况下,只需使用以下命令定制匿名TextWriter
对象的创建就足够了:
fixture.Register<TextWriter>(() => new StringWriter());
我成功做到了:
fixture.Register<Func<TextWriter>>(() => () => new StringWriter());