在步骤定义中,是否可以在运行时检索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:57:31
这里有一个建议。这只是我快速拼凑起来的东西,所以还有很多改进的空间。它依赖于特征文件名与您在描述中提供的特征的标题相同。它还假设您的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;
}它抓取您的当前目录,并将其拆分到功能文件夹应该所在的位置。然后,它会遍历每个特征文件,直到找到路径名中包含您的特征标题的文件,并将其作为完整路径返回。
我不知道目前还有没有其他方法可以得到这个。
发布于 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标记指定的任何文件部署到运行测试的根目录。
不是很好,我也不确定它会不会起作用,但它可能会。
发布于 2014-09-23 22:20:24
也许这会对你有所帮助,在.net 4.5中,你可以获得调用者的路径,看看这个线程source path in .net 4.5
https://stackoverflow.com/questions/25996940
复制相似问题