使用团队城市构建时“无法加载文件或程序集”

时间:2014-01-16 14:33:39

标签: .net unit-testing continuous-integration teamcity .net-assembly

我遇到了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可能失败的任何想法?

3 个答案:

答案 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项目的包引用。克隆/还原/构建。