从“步骤定义”中的SpecFlow要素文件中获取路径

时间:2014-09-23 13:52:46

标签: c# specflow

是否可以在运行期间在步骤定义中检索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的路径。

3 个答案:

答案 0 :(得分:2)

这是一个建议。这只是我快速拼凑的东西,因此有很大的改进空间。它依赖于Feature文件名与您在描述中提供的功能的标题相同。它还假设您的SpecFlow VS项目有一个传统的文件夹结构,因为有很多字符串操作。

首先,调用代码应使用SpecFlow BeforeScenario属性。像这样:

public void BeforeScenario()
{      
   //grabs Feature Title from SpecFlow context
   var featureName = FeatureContext.Current.FeatureInfo.Title;
   //Calls method to obtain path of file
   var featureFilePath = GetFeatureFilePath(featureName);
}

GetFeatureFilePath方法将如下所示:

private static string GetFeatureFilePath(string featureName)
{
    string startupPath = Environment.CurrentDirectory; 
    var splitStartupPath = startupPath.Split(new[] {"\\"}, StringSplitOptions.None);

    var featureFolder = splitStartupPath[0] + @"\\" + 
                        splitStartupPath[1] + @"\\" + 
                        splitStartupPath[2] + @"\\" +
                        splitStartupPath[3] + @"\\" +
                        splitStartupPath[4] + @"\\" + 
                        splitStartupPath[5] + @"\\Features\";

    var dir = new DirectoryInfo(featureFolder);

    foreach (var fi in dir.GetFiles())
    {
        if (fi.FullName.Contains(featureName))
            return fi.FullName;
    }

    return "No Feature File Found With Title: " + featureName;
}

它抓取当前目录并将其拆分到Features文件夹所在的位置。然后,它遍历每个要素文件,直到找到包含其路径名中的要素标题的文件并将其作为完整路径返回。

我目前还没有其他任何方法可以解决这个问题。

答案 1 :(得分:1)

我不认为知道功能文件的路径是可能的,因为功能文件用于生成包含单元测试的文件,并将其编译并复制到测试运行目录。

最简单的方法是将文件设置为解决方案的一部分,然后在项目构建时将它们复制到输出目录。

如果您使用NUnit作为测试框架,那么文件应该与测试执行时位于同一目录中,这样您就可以在不指定任何路径的情况下加载它们,或者使用Assembly.GetExecutingAssembly().Location来查找代码实际执行的地方。

如果您正在使用MSTest,那么您需要在测试中添加[DeploymentItem(FileToDeploy)]属性,以确保文件在运行时实际部署了测试。不幸的是,当Specflow生成测试时,它不会为您添加此项。要解决此问题,您需要创建一个与包含测试的类同名的分部类。此类与具有“特征”功能的功能相同。标记在最后。所以如果你的功能中有这个:

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标记指定的任何文件部署到运行测试的根目录。

不漂亮,我不确定它是否有效,但可能会有效。

答案 2 :(得分:0)

也许这可以帮助你,在.net 4.5中你可以掌握调用者的路径,看一下这个帖子source path in .net 4.5