由于无法找到“TechTalk.SpecFlow”文件,SpecFlow单元测试失败。

4

我有一个使用SpecFlow 1.8.1和mstest的VS2010单元测试项目。为了让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>

你能把你的app.config文件也复制一份吗?我的看起来是这样的:http://pastebin.com/exKSSdPm - t3hn00b
我已经添加了上述的App.Config文件内容。 - SF Lee
请注意,我正在使用VS2010,因此我的提供程序必须是“MsTest.2010”,而不是“MsTest”。 - SF Lee
也许这就是原因-我也在使用VS2010。 - t3hn00b
一点头绪也没有。另一个不同的地方是平台——你已经设置为任何 CPU,而我的是 x86。 - t3hn00b
不,我的解决方案中没有任何“x86”平台。 - SF Lee
5个回答

2

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

命令工具 > 库程序包管理器 > 程序包管理器控制台允许您输入PM> Install-Package SpecFlow

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


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

1
有时候VS2013会在项目文件夹之外查找SpecRun dlls,而是在 C:\Users\**YOUR_USER**\AppData\Local\Temp\VisualStudioTestExplorerExtensions\SpecRun.Runner.1.3.0\tools 中查找。所以你只需要把所有必要的SpecFlow库放在那里即可。

0
我发现的一个技巧是为项目中创建的每一个SpecFlow feature添加另一个类,以使其正常工作。这个类看起来像这样:-
[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,但它确实提供了为什么它不起作用的线索。如果有人想出更优雅的解决方案,那就太好了。


0
我终于找到了更合适的解决方法。我只需要添加一个后建事件来从构建输出中移除 .config 文件。(App.config 文件仅用于在设计时生成代码,运行时根本不使用,因此可以删除。)
后建事件的命令如下:-
del /f /q "$(TargetDir)$(TargetFileName).config"

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

if "$(IsDesktopBuild)"=="false" del /f /q "$(TargetDir)$(TargetFileName).config"

这种方法唯一的问题是会将所有“不确定”的测试标记为错误。这是因为ScenarioContext.Current.Pending()需要在运行时知道提供程序,以便知道使用哪个Assert类来抛出不确定异常。 - SF Lee
更好的方法是检查 $(IsDesktopBuild),以便在从 Visual Studio 运行时不删除 .config 文件。 - SF Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接