这是我能想到的最好的,它并不理想,但它确实完成了你想要的。
您创建一个新类来实现您生成的 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
's
这样做的缺点是您现在拥有相同测试的 2 个副本,因为您继承了旧测试。所以在这种情况下,你有来自SpecialTest
和的测试YourNormalFeatureClass
。这意味着您不需要运行YourNormalFeatureClass
测试而只运行SpecialTest
测试。
如果 SpecFlow 允许您自定义代码生成过程,所有这些都将很容易解决。这样你就可以ITestOutputHelper
通过生成的代码公开。从步骤中消耗它是相同的。