c# - 使用 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) SelectArrayIterator
2.ToArray() Enumerable.ToArray[TSource](IEnumerable
1 来源) 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;
}
解决方案
使用 SpecRun.SpecFlow 包,您可以使用 SpecFlow+ Runner 作为单元测试运行器。您没有使用 xUnit,因此您不能使用 xUnit API 来记录内容。
你有两个选择:
您使用 SpecFlow+ Runner 并使用
ISpecFlowOutputHelper
界面来编写您的日志条目您更改为 SpecFlow.xUnit 包(并删除 SpecRun.SpecFlow 包)以使用 xUnit 作为单元测试运行器。然后您仍然可以使用该
ISpecFlowOutputHelper
接口或直接使用 xUnit API。
全面披露:我是 SpecFlow 和 SpecFlow+ 的社区经理
推荐阅读
- javascript - 在 Angular 项目中实现 Google-Blockly 的块工厂
- reactjs - 为什么 DOM 没有随着 ReactJS 中的状态变化而更新?
- javascript - state.concat 不是函数 - 类型“ITask”不是数组类型
- r - 是否可以通过仅包含包的特定部分来减小降价 html 报告的大小?
- sql-server - SQL bacpac 导出中不支持的元素
- transactions - 使用 Corda 进行债券交易的基本方法
- f# - 向(F#)记录添加“抽象”方法
- python-3.x - 使用 Youtube 上的机器人播放音乐而不下载文件
- r - “R工作室未开放”
- python-3.x - 计算某个事件的时间跨度的函数