AutoFixture:提供一个Func作为构造函数参数

时间:2013-05-23 13:09:30

标签: c# autofixture

我对单元测试很新,并且正在使用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设置它。任何帮助都将非常感谢。

3 个答案:

答案 0 :(得分:6)

From version 2.2及更高版本,AutoFixture会自动处理FuncAction个代表。

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

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

您可以详细了解Inject方法here

答案 1 :(得分:4)

正如@NikosBaxevanis在答案中正确指出的那样,AutoFixture能够创建anonymous instances of any delegate type。这些匿名委托采用动态生成方法的形式。

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

  1. 如果代理人的签名是void,则创建的方法将是a 无操作
  2. 如果委托的签名具有返回值T,则创建的方法将返回T的匿名实例。
  3. 鉴于这些规则,在Func<TextWriter>的情况下,仅使用以下内容自定义匿名TextWriter对象的创建就足够了:

    fixture.Register<TextWriter>(() => new StringWriter());
    

答案 2 :(得分:-1)

我设法做到了:

fixture.Register<Func<TextWriter>>(() => () => new StringWriter());