4

我对单元测试很陌生,正在用 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));

所以在我的测试中我应该这样调用函数:

() => new StringWriter(PokerClientIniWriter)

但是如何通过 AutoFixture 进行设置。任何帮助将不胜感激。

4

3 回答 3

7

从 2.2及更高版本开始,AutoFixture 会自动处理FuncAction委托。

在您的示例中,您只需将StringWriter类型作为TextWriter类型注入,如下所示:

fixture.Inject<TextWriter>(new StringWriter());

您可以在此处阅读有关该Inject方法的更多信息。

于 2013-05-24T05:17:28.493 回答
4

正如@NikosBaxevanis 在他的回答中正确指出的那样,AutoFixture 能够创建任何委托类型的匿名实例。这些匿名委托采用动态生成方法的形式。

当前实施的生成策略遵循以下规则:

  1. 如果委托的签名是void,则创建的方法将是 no-op
  2. 如果委托的签名有返回值T,则创建的方法将返回 的匿名实例T

鉴于这些规则,在这种情况下,只需自定义匿名对象Func<TextWriter>的创建就足够了:TextWriter

fixture.Register<TextWriter>(() => new StringWriter());
于 2013-05-24T14:15:18.500 回答
-1

我设法做到了:

fixture.Register<Func<TextWriter>>(() => () => new StringWriter());
于 2013-05-23T15:05:59.610 回答