首页 > 解决方案 > 使用 SpecRun.Specflow 和 xUnit(ITestOutputHelper) 进行日志记录 - BoDi.ObjectContainerException

问题描述

我正在尝试将日志添加到 specflow 测试中,但不幸的是我遇到了异常。我正在使用SpecRun.Specflow v3.4.19带有xunit. 在尝试ITestOutputHelper通过上下文注入注入时,我得到了这个:

无法解析接口:Xunit.Abstractions.ITestOutputHelper(解析路径:SpecflowTesting.Steps.CalculatorStepDefinitions) 堆栈跟踪:BoDi.ObjectContainerException:无法解析接口:Xunit.Abstractions.ITestOutputHelper(解析路径:SpecflowTesting.Steps.CalculatorStepDefinitions)TypeRegistration.Resolve (ObjectContainer 容器, RegistrationKey keyToResolve, ResolutionList resolutionPath) ObjectContainer.ResolveObject(RegistrationKey keyToResolve, ResolutionList resolutionPath) ObjectContainer.Resolve(Type typeToResolve, ResolutionList resolutionPath, String name) <>c__DisplayClass57_0.b__0(ParameterInfo p) SelectArrayIterator2.ToArray() Enumerable.ToArray[TSource](IEnumerable1 来源) ObjectContainer.ResolveArguments(IEnumerable`1 参数, RegistrationKey keyToResolve, ResolutionList resolutionPath) ObjectContainer.CreateObject(Type type, ResolutionList resolutionPath, RegistrationKey keyToResolve) TypeRegistration.Resolve(ObjectContainer container, RegistrationKey keyToResolve, ResolutionList resolutionPath) ObjectContainer.ResolveObject(RegistrationKey keyToResolve , ResolutionList resolutionPath) ObjectContainer.Resolve(Type typeToResolve, ResolutionList resolutionPath, String name) ObjectContainer.Resolve(Type typeToResolve, String name) TestObjectResolver.ResolveBindingInstance(Type bindingType, IObjectContainer container) line 11 lambda_method(Closure, IContextManager, Int32) BindingInvoker.InvokeBinding (IBinding 绑定、IContextManager contextManager、Object[] 参数、ITestTracer testTracer、TimeSpan& duration) 第 69 行 TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) line 514 RunnerTestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) TestExecutionEngine.ExecuteStep(IContextManager contextManager, StepInstance stepInstance) 第 435 行 TestExecutionEngine.OnAfterLastStep() 第 260 行RunnerTestExecutionEngine.OnAfterLastStep() TestRunner.CollectScenarioErrors() 第 60 行 CalculatorFeature.ScenarioCleanup() CalculatorFeature.AddTwoNumbers() 第 8 行 StaticOrInstanceMethodExecutor.ExecuteInternal(ITestThreadExecutionContext testThreadExecutionContext) StaticOrInstanceMethodExecutor.Execute(ITestThreadExecutionContext testThreadExecutionContext) TestNodeTask.Execute()Object[] arguments) 第 514 行 RunnerTestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) TestExecutionEngine.ExecuteStep(IContextManager contextManager, StepInstance stepInstance) 第 435 行 TestExecutionEngine.OnAfterLastStep() 第 260 行 RunnerTestExecutionEngine.OnAfterLastStep() TestRunner.CollectScenarioErrors() 第 60 行CalculatorFeature.ScenarioCleanup() CalculatorFeature.AddTwoNumbers() 第 8 行 StaticOrInstanceMethodExecutor.ExecuteInternal(ITestThreadExecutionContext testThreadExecutionContext) StaticOrInstanceMethodExecutor.Execute(ITestThreadExecutionContext testThreadExecutionContext) TestNodeTask.Execute()Object[] arguments) 第 514 行 RunnerTestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) TestExecutionEngine.ExecuteStep(IContextManager contextManager, StepInstance stepInstance) 第 435 行 TestExecutionEngine.OnAfterLastStep() 第 260 行 RunnerTestExecutionEngine.OnAfterLastStep() TestRunner.CollectScenarioErrors() 第 60 行CalculatorFeature.ScenarioCleanup() CalculatorFeature.AddTwoNumbers() 第 8 行 StaticOrInstanceMethodExecutor.ExecuteInternal(ITestThreadExecutionContext testThreadExecutionContext) StaticOrInstanceMethodExecutor.Execute(ITestThreadExecutionContext testThreadExecutionContext) TestNodeTask.Execute()OnAfterLastStep() 第 260 行 RunnerTestExecutionEngine.OnAfterLastStep() TestRunner.CollectScenarioErrors() 第 60 行 CalculatorFeature.ScenarioCleanup() CalculatorFeature.AddTwoNumbers() 第 8 行 StaticOrInstanceMethodExecutor.ExecuteInternal(ITestThreadExecutionContext testThreadExecutionContext) StaticOrInstanceMethodExecutor.Execute(ITestThreadExecutionContext testThreadExecutionContext) TestNodeTask.Execute()OnAfterLastStep() 第 260 行 RunnerTestExecutionEngine.OnAfterLastStep() TestRunner.CollectScenarioErrors() 第 60 行 CalculatorFeature.ScenarioCleanup() CalculatorFeature.AddTwoNumbers() 第 8 行 StaticOrInstanceMethodExecutor.ExecuteInternal(ITestThreadExecutionContext testThreadExecutionContext) StaticOrInstanceMethodExecutor.Execute(ITestThreadExecutionContext testThreadExecutionContext) TestNodeTask.Execute()

用法:

    private ITestOutputHelper _testOutputHelper;

    private readonly ScenarioContext _scenarioContext;

    public CalculatorStepDefinitions(ScenarioContext scenarioContext, ITestOutputHelper testOutputHelper)
    {
        _scenarioContext = scenarioContext;
        _testOutputHelper = testOutputHelper;
    }

标签: c#xunitspecflow

解决方案


使用 SpecRun.SpecFlow 包,您可以使用 SpecFlow+ Runner 作为单元测试运行器。您没有使用 xUnit,因此您不能使用 xUnit API 来记录内容。

你有两个选择:

  1. 您使用 SpecFlow+ Runner 并使用ISpecFlowOutputHelper界面来编写您的日志条目

  2. 您更改为 SpecFlow.xUnit 包(并删除 SpecRun.SpecFlow 包)以使用 xUnit 作为单元测试运行器。然后您仍然可以使用该ISpecFlowOutputHelper接口或直接使用 xUnit API。


全面披露:我是 SpecFlow 和 SpecFlow+ 的社区经理


推荐阅读