これは私が思いつくことができる最高のものです。理想的ではありませんが、あなたが望むものを達成します.
生成された 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、生成されたコードを介して公開できます。ステップ内からの消費は同じです。