C# 使用Specflow和xUnit 2(ITestOutputHelper)进行日志记录

C# 使用Specflow和xUnit 2(ITestOutputHelper)进行日志记录,c#,specflow,xunit,xunit2,C#,Specflow,Xunit,Xunit2,不幸的是,我有一个在本地通过的Specflow测试,但是它在VSO Build vNext服务器上失败了,我真的需要在测试运行期间查看详细信息,这样我才能弄清楚到底发生了什么 但是我正在努力尝试将ITestOutputHelper注入到像这样的Specflow绑定中 publicsomesteps(ITestOutputHelper outputHelper) 但是Specflow抱怨这条消息 无法解析BoDi.ObjectContainerException接口:Xunit.Abstracti

不幸的是,我有一个在本地通过的Specflow测试,但是它在VSO Build vNext服务器上失败了,我真的需要在测试运行期间查看详细信息,这样我才能弄清楚到底发生了什么

但是我正在努力尝试将
ITestOutputHelper
注入到像这样的Specflow绑定中

publicsomesteps(ITestOutputHelper outputHelper)

但是Specflow抱怨这条消息

无法解析BoDi.ObjectContainerException接口:Xunit.Abstractions.ITestOutputHelper(解析路径:…)


在Specflow测试期间,究竟如何查看日志和输出?

这是我能想到的最好的方法,虽然不理想,但它确实实现了您想要的

您将创建一个新类来实现生成的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");
    }

}
现在,您可以通过访问steps文件中的XUnit
ITestOutputHelper

var helper = this._scenarioContext.Get<Xunit.Abstractions.ITestOutputHelper>("helper");
helper.WriteLine("output from within the steps file that will be written to xunit!");
var helper=this.\u scenarioContext.Get(“helper”);
WriteLine(“将写入xunit的steps文件中的输出”);
您需要使用
helper
变量进行防御,以确保不会得到任何
NullReferenceException

这样做的缺点是,由于继承了旧的测试,现在您有了同一测试的两个副本。因此,在本例中,您有来自
SpecialTest
YourNormalFeatureClass
的测试。这意味着您不需要运行
YourNormalFeatureClass
测试,而只需要运行
SpecialTest
测试


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

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

ScenarioContext.Current.ScenarioContainer.Resolve<ITestOutputHelper>().WriteLine("Hello");
ScenarioContext.Current.ScenarioContainer.Resolve().WriteLine(“Hello”);

您不能在步骤中跟踪.WriteLine或
调试.WriteLine
吗?@avalancis在另一条评论中提供的链接中描述了这一点。但不幸的是,xUnit2没有捕获跟踪和调试输出。您必须使用ITestOutputHelper。我开始越来越不喜欢xUnit.net了。即使在github上,似乎也只有很少的贡献者,没有多少提交和回复来解决报告的问题。[rant off]自8月份以来,有一个拉取请求正在等待,它正是这样做的:太棒了,pitty,他们没有拉取它。这对我来说很有效——还要注意,您可以通过.NET Core中的依赖项注入(DI)而不是使用ScenarioContext.Current来获取中的ScenarioContext。