我有一个名为“ RollbackManager
”的类,它用于添加测试中的一些操作并在测试后执行所有操作。
我使用SpecFlow进行测试,因此为了在测试后执行某些操作,我使用了[AfterScenario]
钩子。
问题是:在并行运行测试时,我无法使RollbackManager
保持静态!
问题是:如何从钩子访问在SpecFlow步骤定义中创建的RollBackManager类的实例?
我当前的项目结构:
具有RollbackManager的基类:
public class StepBase : Steps
{
public RollbackManager RollbackManager { get; } = new RollbackManager();
protected new ScenarioContext ScenarioContext { get; set; }
public StepBase(ScenarioContext scenarioContext)
{
RollbackManager = new RollbackManager();
}
}
步骤定义类的示例:
[Binding]
public sealed class ThenExport : StepBase
{
public ThenExport(ScenarioContext scenarioContext) : base(scenarioContext)
{
}
[Then(@"export status should contain entities: ""(.*)""")]
public void ThenExportStatusShouldContain(List<String> commaSeparatedList)
{
RollbackManager.RegisterRollback(() => Console.WriteLine());
}
}
我的带有钩子的班级:
[Binding]
public sealed class SpecFlowTestsBase
{
[AfterScenario]
public void AfterScenario()
{
// here I need my rollbacks craeted in steps
}
}
答案 0 :(得分:1)
首先,不要使用基步类并将钩子放入其中。您的钩子将被执行多次。
现在是您的真正问题:
要在步骤类之间共享状态,可以使用SpecFlow的上下文注入。
绑定类的每个实例都将获得TestState类的相同实例。
它是这样的:
public class TestState
{
public RollbackManager RollbackManager { get; } = new RollbackManager();
}
[Binding]
public sealed class ThenExport
{
private TestState _testState;
public ThenExport(TestState testState)
{
_testState = testState;
}
[Then(@"export status should contain entities: ""(.*)""")]
public void ThenExportStatusShouldContain(List<String> commaSeparatedList)
{
_testState.RollbackManager.RegisterRollback(() => Console.WriteLine());
}
}
[Binding]
public sealed class Hooks
{
private TestState _testState;
public ThenExport(TestState testState)
{
_testState = testState;
}
[AfterScenario]
public void AfterScenario()
{
_testState.RollBackManager.DoYourStuff();
}
}
您可以在此处找到其他文档:
https://specflow.org/documentation/Sharing-Data-between-Bindings/
https://specflow.org/documentation/Context-Injection/