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设置这个呢?如有任何帮助,将不胜感激。

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

从2.2及以上版本开始,AutoFixture自动处理FuncAction委托。

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

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

您可以在这里阅读更多关于Inject方法的信息

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

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

  1. 如果委托的签名是void,创建的方法将是a操作来
  2. 如果委托的签名有一个返回值T,创建的方法将返回一个T的匿名实例。
根据这些规则,在Func<TextWriter>的情况下,只需使用以下命令定制匿名TextWriter对象的创建就足够了:
fixture.Register<TextWriter>(() => new StringWriter());

我成功做到了:

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