簡體   English   中英

AutoFixture:提供一個Func作為構造函數參數

[英]AutoFixture: Supply a Func as a constructor argument

我對單元測試很新,並且正在使用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設置它。 任何幫助將舉例如將非常感謝。

從2.2版及更高版本開始 ,AutoFixture會自動處理FuncAction代理。

在您的示例中,您只需要將StringWriter類型作為TextWriter類型注入,如下所示:

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

您可以在此處閱讀有關Inject方法的更多信息。

正如@NikosBaxevanis在他的回答中正確指出的那樣,AutoFixture能夠創建任何委托類型的匿名實例 這些匿名委托采用動態生成的方法的形式。

正如目前所實施的那樣,生成策略遵循以下規則:

  1. 如果委托的簽名void ,則創建的方法將為no-op
  2. 如果委托的簽名具有返回值T ,則創建的方法將返回T的匿名實例。

根據這些規則,在Func<TextWriter>的情況下,僅使用以下內容自定義匿名TextWriter對象的創建就足夠了:

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

我成功地做到了這一點:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM