4

我有一个 VS2010 单元测试项目设置为使用 SpecFlow 1.8.1 和 mstest。为了让 SpecFlow 单元测试正常工作,我做了以下工作:-

  1. 我在我的项目中添加了对以下文件的引用:-

    Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
    TechTalk.SpecFlow.dll

    请注意,TechTalk.SpecFlow.dll 已添加到我的项目中,并且引用指向该文件。

  2. 我已将 TechTalk.SpecFlow.dll 引用的“复制本地”属性设置为 True。

  3. 我还添加了一个 App.Config,将“MsTest.2010”指定为提供者,并为 SpecFlow 功能重新生成了所有代码隐藏。

在我的 VS2010 中一切正常,测试在 SpecFlow 测试运行器和 mstest 测试运行器中都成功运行。但是当我尝试在 TFS 2008 中运行 mstests(使用 .vsmdi 测试列表文件)时,它失败了,出现以下异常:-

Class Initialization method MyNamespace.MyTestFeature.FeatureSetup threw exception.
System.Configuration.ConfigurationErrorsException:
System.Configuration.ConfigurationErrorsException: An error occurred creating the
configuration section handler for specFlow: Could not load file or assembly
'TechTalk.SpecFlow' or one of its dependencies. The system cannot find the file
specified. (D:\Projects\TestProject\TestResults\administrator_MYPC 2012-06-27
18_30_05_Any CPU_Debug\Out\TestProject.DLL.config line 4) --->
System.IO.FileNotFoundException: Could not load file or assembly 'TechTalk.SpecFlow'
or one of its dependencies. The system cannot find the file specified.

请注意,TFS 很好地构建了项目,并且它在同一个项目中运行其他单元测试(正常的 mstests,而不是 SpecFlow)没有问题。它仅在 SpecFlow 测试运行时失败。

那么我做错了什么?

编辑:我的 App.Config 文件的内容如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section
       name="specFlow"
       type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow"/>
  </configSections>
  <specFlow>
    <unitTestProvider name="MsTest.2010" />

    <runtime detectAmbiguousMatches="true"
         stopAtFirstError="false"
         missingOrPendingStepsOutcome="Inconclusive" />

    <trace traceSuccessfulSteps="true"
           traceTimings="false"
           minTracedDuration="0:0:0.1" />
  </specFlow>
</configuration>
4

5 回答 5

2

按照本网站本网站上的说明:

该命令 Tools > Library Package Manager > Package Manager Console 允许您输入PM> Install-Package SpecFlow

当提示返回“安装成功”时,SpecFlow 组件现在出现在项目的引用中。并且 MSTest 项目现在可以成功编译(至少对我而言)。

于 2013-02-19T14:35:30.177 回答
1

我也遇到了这个错误,在我的情况下,问题是我使用 \...\obj\Debug||Release\ 文件夹作为目标,而不是 \...\bin\Debug||Release\ 文件夹。查看这些文件夹,我发现前者缺少 TechTalk.dll 程序集。只需切换到我的 .bat 文件,问题就解决了。

于 2013-05-07T12:41:13.003 回答
1

有时 VS2013 不是在项目文件夹中寻找 SpecRun dll,而是在C:\Users\**YOUR_USER**\AppData\Local\Temp\VisualStudioTestExplorerExtensions\SpecRun.Runner.1.3.0\tools. 所以你只需要把所有必要的 SpecFlow 库放在那里

于 2016-03-15T09:05:01.257 回答
0

我发现让它工作的一个技巧是为我在项目中创建的每个 SpecFlow 功能添加另一个类。该课程如下所示:-

[DeploymentItem(@"TechTalk.SpecFlow.dll")]
partial class MyTestFeature { }

// The above class-name needs to come from the auto-generated code behind
// (.feature.cs) for each SpecFlow feature.

我认为这是一个非常讨厌的 hack,但它确实提供了为什么它不起作用的线索。如果有人想出一个更优雅的解决方案,那就太好了。

于 2012-06-27T08:50:33.203 回答
0

我终于找到了解决这个问题的更合适的方法。我只需要添加一个构建后事件即可从构建输出中删除 .config 文件。(App.config 文件仅用于在设计时生成代码隐藏。在运行时根本不使用它,因此可以将其删除。)

构建后事件的命令如下所示:-

del /f /q "$(TargetDir)$(TargetFileName).config"

更正:.config 文件用于生成不确定的结果,因此更好的构建后事件命令如下:-

if "$(IsDesktopBuild)"=="false" del /f /q "$(TargetDir)$(TargetFileName).config"
于 2012-06-28T01:17:22.220 回答