SpecFlow:ClassInitialize和TestContext

rob*_*oh. 8 c# mstest specflow visual-studio-2012

首先,我是SpecFlow的新手.

我有一个功能文件,我已经/想要自动使用MSTest作为功能测试运行,涉及完全设置的服务器,数据访问......为此,我必须使用SpecFlow的'Given'中的数据配置服务器阻止并在之后启动它.我还必须将一些文件复制到测试的输出目录中.

在非SpecFlow功能测试中,我使用ClassInitialize属性从TestContext获取TestDeploymentDir; 这样的事情:

[ClassInitialize]
public static void ClassSetup(TestContext context)
{
  TargetDataDeploymentRoot = context.TestDeploymentDir;
}
Run Code Online (Sandbox Code Playgroud)

现在有了SpecFlow,我不能再使用这个属性了,因为它被SpecFlow本身使用.确实存在一些新属性,例如BeforeFeature,它的行为类似但是它不会将TestContext作为参数传递.

我只需要访问TestContext的TestDeploymentDir,以便在真正推出我的功能测试服务器之前复制一些文件 - 没有SpecFlow就可以轻松实现,但使用SpecFlow几乎不可能.

如何处理这个问题?

有可能吗?

非常感谢您的建议!

罗伯特


环境:

  • Visual Studio 2012
  • SpecFlow 1.9.0.77

And*_*ich 5

从 SpecFlow 2.2.1 开始,TestContext 可通过上下文注入获得。( https://github.com/techtalk/SpecFlow/pull/882 )

可以直接从容器中获取:

ScenarioContext.Current.ScenarioContainer.Resolve<Microsoft.VisualStudio.TestTools.UnitTesting.TestContext>()

或通过上下文注入:

public class MyStepDefs
{
    private readonly TestContext _testContext;
    public MyStepDefs(TestContext testContext) // use it as ctor parameter
    { 
        _testContext = testContext;
    }

    [BeforeScenario()]
    public void BeforeScenario()
    {
        //now you can access the TestContext
    } 
}
Run Code Online (Sandbox Code Playgroud)


Voi*_*Ray -1

有一个FeatureContext以及更常用的ScenarioContext。当然,不同之处在于,FeatureContext 在完整功能的执行期间存在,而 ScenarioContext 仅在场景期间存在。

例如:

添加到上下文:

ScenarioContext.Current.Add("ObjectName", myObject);
Run Code Online (Sandbox Code Playgroud)

得到:

var myObject = ScenarioContext.Current.Get<object>("ObjectName");
Run Code Online (Sandbox Code Playgroud)

你可以在这里读更多关于它的内容。