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

3

不确定我是否使用的是更新版本,现在更容易了,但这似乎对我有用:

ScenarioContext.Current.ScenarioContainer.Resolve<ITestOutputHelper>().WriteLine("Hello");
于 2018-07-09T13:09:24.107 回答
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's

这样做的缺点是您现在拥有相同测试的 2 个副本,因为您继承了旧测试。所以在这种情况下,你有来自SpecialTest和的测试YourNormalFeatureClass。这意味着您不需要运行YourNormalFeatureClass测试而只运行SpecialTest测试。

如果 SpecFlow 允许您自定义代码生成过程,所有这些都将很容易解决。这样你就可以ITestOutputHelper通过生成的代码公开。从步骤中消耗它是相同的。

于 2016-11-03T00:01:40.620 回答