首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从步骤定义中的SpecFlow要素文件获取路径

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

Stack Overflow用户
提问于 2014-09-23 21:52:46
回答 3查看 3.3K关注 0票数 5

在步骤定义中,是否可以在运行时检索SpecFlow特征文件的路径?

代码片段:

代码语言:javascript
复制
[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的路径。

EN

回答 3

Stack Overflow用户

发布于 2014-09-23 22:57:31

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

首先,调用代码应该使用SpecFlow BeforeScenario属性。如下所示:

代码语言:javascript
复制
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将如下所示:

代码语言:javascript
复制
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;
}

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

我不知道目前还有没有其他方法可以得到这个。

票数 3
EN

Stack Overflow用户

发布于 2014-09-23 22:27:41

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

最简单的做法是将文件设置为解决方案的一部分,然后在项目生成时将其复制到输出目录中。

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

如果您使用的是MSTest,那么您需要向测试中添加一个[DeploymentItem(FileToDeploy)]属性,以确保在测试运行时,该文件实际与测试一起部署。不幸的是,当Specflow生成测试时,它不会为你添加这个。要解决这个问题,您需要创建一个与包含测试的类同名的分部类。这个类被称为与末尾带有' feature‘标记的功能相同。因此,如果您的功能中包含以下内容:

代码语言:javascript
复制
Feature: Do A Thing

您的测试类将命名为DoAThingFeature

因此,您需要创建一个分部类,如下所示:

代码语言:javascript
复制
[DeploymentItem("FileToDeploy.ext")]
public partial class DoAThingFeature
{}

为了确保MsTest将您需要的文件复制到正确的目录。

编辑

根据你的评论,你也许可以做一些类似的事情

将标签添加到要素@hasFiles @source:myFile.xlsx

然后你可以添加这个类:

代码语言:javascript
复制
[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标记指定的任何文件部署到运行测试的根目录。

不是很好,我也不确定它会不会起作用,但它可能会。

票数 1
EN

Stack Overflow用户

发布于 2014-09-23 22:20:24

也许这会对你有所帮助,在.net 4.5中,你可以获得调用者的路径,看看这个线程source path in .net 4.5

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25996940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档