在步骤定义中,是否可以在运行时检索SpecFlow特征文件的路径?
代码片段:
[Given(@"Some given statement")]
public void GivenSomeGivenStatement() {
var featureFilePath = // retrieve the path of the feature file
// that executes this step.
}上下文:
我们在数据库和查询上进行测试。源数据在Excel文件和.SQL文件中创建(用于检查查询)。这些源数据是大型数据集,不适合放入要素文件本身或使用SpecFlow.Plus.Excel扩展名。
为了使数据靠近特征文件,我们希望将这些数据放在与特征文件本身相同的文件夹中。要实现这一点,我们需要此功能文件的路径,因此我们还需要testdata的路径。
发布于 2014-09-23 22:27:41
我不认为知道特征文件的路径是可能的,因为特征文件用于生成包含单元测试的文件,该文件被编译并复制到测试运行目录中。
最简单的做法是将文件设置为解决方案的一部分,然后在项目生成时将其复制到输出目录中。
如果您使用NUnit作为测试框架,那么这些文件应该与执行测试的目录相同,这样您就可以在不指定任何路径的情况下加载它们,或者使用Assembly.GetExecutingAssembly().Location查找代码实际执行的位置。
如果您使用的是MSTest,那么您需要向测试中添加一个[DeploymentItem(FileToDeploy)]属性,以确保在测试运行时,该文件实际与测试一起部署。不幸的是,当Specflow生成测试时,它不会为你添加这个。要解决这个问题,您需要创建一个与包含测试的类同名的分部类。这个类被称为与末尾带有' feature‘标记的功能相同。因此,如果您的功能中包含以下内容:
Feature: Do A Thing您的测试类将命名为DoAThingFeature
因此,您需要创建一个分部类,如下所示:
[DeploymentItem("FileToDeploy.ext")]
public partial class DoAThingFeature
{}为了确保MsTest将您需要的文件复制到正确的目录。
编辑
根据你的评论,你也许可以做一些类似的事情
将标签添加到要素@hasFiles @source:myFile.xlsx
然后你可以添加这个类:
[Binding]
public class DeployFiles
{
[BeforeScenario("hasFiles")]
public void CopyFiles()
{
..in here find the current executing directory and search
..the subtree for any files defined in the
..ScenarioInfo.Tags array that start with `source:` and copy
..them to the current executing directory
}
}然后,任何使用@hasFiles标记的场景都会将@source标记指定的任何文件部署到运行测试的根目录。
不是很好,我也不确定它会不会起作用,但它可能会。
https://stackoverflow.com/questions/25996940
复制相似问题