6

残念ながら、Specflow テストはローカルで合格しましたが、VSO Build vNext サーバーでは失敗しました。何が起こっているのかを把握できるように、テストの実行中に詳細な情報を確認する必要があります。

しかし、私はITestOutputHelperそのようにSpecflowバインディングに注入しようとするのに苦労しています

public SomeSteps(ITestOutputHelper outputHelper)

しかし、Specflowはメッセージに文句を言います

BoDi.ObjectContainerException Interface cannot be resolved: Xunit.Abstractions.ITestOutputHelper (resolution path: ...)

Specflow テスト中にログを表示し、出力を表示するにはどうすればよいでしょうか?

4

2 に答える 2

2

これは私が思いつくことができる最高のものです。理想的ではありませんが、あなたが望むものを達成します.

生成された xunit クラスを実装する新しいクラスを作成します。私の例では、生成されたクラスが呼び出されますYourNormalFeatureClass

public class SpecialTest : YourNormalFeatureClass
{
    private Xunit.Abstractions.ITestOutputHelper helper;

    public SpecialTest(ITestOutputHelper helper) : base()
    {
        this.helper = helper;   
    }

    public override void ScenarioSetup(ScenarioInfo scenarioInfo)
    {
        base.ScenarioSetup(scenarioInfo);

        // you'd want a better way to keep track of this string
        TechTalk.SpecFlow.TestRunnerManager.GetTestRunner().ScenarioContext.Set(this.helper, "helper");
    }

}

ITestOutputHelperこれで、ステップ ファイル内から次の方法でXUnit にアクセスできるようになりました。

var helper = this._scenarioContext.Get<Xunit.Abstractions.ITestOutputHelper>("helper");
helper.WriteLine("output from within the steps file that will be written to xunit!");

helperを取得しないようにするには、その変数を防御する必要がありNullReferenceExceptionます

これの欠点は、古いテストを継承したため、同じテストのコピーが 2 つあることです。したがって、この場合、 および からのテストがSpecialTestありYourNormalFeatureClassます。これは、YourNormalFeatureClassテストを実行する必要はなく、テストのみを実行する必要があることを意味しますSpecialTest

SpecFlow でコード生成プロセスをカスタマイズできるようにすれば、これらすべてを簡単に解決できます。そうすればITestOutputHelper、生成されたコードを介して公開できます。ステップ内からの消費は同じです。

于 2016-11-03T00:01:40.620 に答える