我对单元测试很新,并且正在使用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>();
}
}
我不知道如何设置构造函数参数(主要是第一个参数--func部分)。
在我的业务逻辑中,我正在实例化这个类:
new PokerClientIniGenerateCommand(
() => new StreamWriter(PokerClientIniWriter),
franchise));
所以在我的测试中我应该像这样调用func:
() => new StringWriter(PokerClientIniWriter)
但是如何通过AutoFixture设置它。任何帮助都将非常感谢。
答案 0 :(得分:6)
From version 2.2及更高版本,AutoFixture会自动处理Func
和Action
个代表。
在您的示例中,您只需要将StringWriter
类型注入TextWriter
类型,如下所示:
fixture.Inject<TextWriter>(new StringWriter());
您可以详细了解Inject
方法here。
答案 1 :(得分:4)
正如@NikosBaxevanis在答案中正确指出的那样,AutoFixture能够创建anonymous instances of any delegate type。这些匿名委托采用动态生成方法的形式。
目前实施的生成策略遵循以下规则:
void
,则创建的方法将是a
无操作 T
,则创建的方法将返回T
的匿名实例。鉴于这些规则,在Func<TextWriter>
的情况下,仅使用以下内容自定义匿名TextWriter
对象的创建就足够了:
fixture.Register<TextWriter>(() => new StringWriter());
答案 2 :(得分:-1)
我设法做到了:
fixture.Register<Func<TextWriter>>(() => () => new StringWriter());