我遇到了Team City(8.0.4)构建服务器上的单元测试问题 - 代码构建&通过Resharper和nCrunch在本地运行所有测试。
但是当在服务器上运行时,我得到以下错误,即使Unity程序集与单元测试程序集存在于同一目录中,并在单元测试程序集中引用。
SetUp方法失败。 SetUp:System.IO.FileNotFoundException:无法加载文件或程序集“Microsoft.Practices.Unity,Version = 2.0.414.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”或其依赖项之一。该系统找不到指定的文件。 在XXXX.Unity.UnityContainerAdapter..ctor() at XXXX.GraphExtensionsTests..ctor()in c:\ TeamCityV7 \ Agent-1 \ work \ f02f7e27c0bedfa2 \ XXXX \ Graph.Tests \ Extensions \ GraphExtensionsTests.cs:line 44
我已经确认了Microsoft.Practices.Unity的副本是正确的版本。
我还确认程序集是使用完整版本的框架构建的 - 不使用客户端配置文件。
Team City可能失败的任何想法?
答案 0 :(得分:15)
检查您用于定位测试组件的模式。我和另一个库有类似的问题,结果发现模式是在bin \ Release和obj \ Release下找到测试程序集; obj文件夹不包含项目引用的所有程序集,实际上只是编译器的临时文件夹。
答案 1 :(得分:1)
我最近发现的另一种可能性是,如果您使用的是未明确引用的库,则TeamCity将不会收集该库以供使用,并且在隐式引用该程序集时将失败。我在试图弄清楚为什么在我的测试项目中引用的NHibernate.ByteCode.Castle没有被加载并在TeamCity上导致FileNotFoundException时发现了这一点。最终,我做了一个“虚拟”单元测试:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NHibernate.ByteCode.Castle;
namespace MyNamespace
{
[TestClass]
public class CastleProxyPresenceTest
{
[TestMethod]
[TestCategory("Infrastructure: This test forces TeamCity to load the NHibernate.ByteCode.Castle.dll file.")]
public void CastleProxyLoads()
{
var dummy = new LazyFieldInterceptor();
Assert.IsNotNull(dummy);
}
}
}
...在此之后,正确加载文件并编译我的单元测试。
答案 2 :(得分:0)
第一步是核对存储库的本地副本并重新克隆它。如果要部署分支,请在还原软件包和首次构建之前切换到该分支。您将获得有关该问题的真正原因的更好线索。
此处未列出的一种可能性是,如果您的测试项目是Framework项目,但是同一解决方案中有一个.NET Standard项目,则该测试项目可能无法在干净的位置上找到Standard项目的包引用。克隆/还原/构建。