使用MSBuild时不会构建私有访问器

时间:2009-08-24 01:00:42

标签: .net unit-testing msbuild nunit cruisecontrol.net

我的构建服务器使用MSBuild来构建我的应用程序。我们的单元测试需要访问一些私有成员进行测试,因此我们使用内置的私有访问器。 Visual Studio没有问题,但是当我们将代码推送到构建服务器时,我们得到错误:

  

MyTest.cs(96,13):errorCS0246:The   类型或命名空间名称'My_Accessor'   无法找到(你错过了吗?   使用指令或程序集   引用?)

为什么MSBuild会忽略私有访问器以及如何修复它?

我们的测试框架使用NUnit,而持续集成服务器使用CruiseControl.Net。

编辑: 根据注释,这里是一些存储库模式类的基类测试代码。

MockRepository mocks = new MockRepository();

IDataContextWrapper wrapper = mocks.DynamicMock<IDataContextWrapper>();

Repository_Accessor target = new Repository_Accessor(wrapper);
Assert.AreEqual(wrapper, target._DataContext);

此代码只是验证成员变量_DataContext是否设置为模拟包装器。在构建服务器上使用MSBuild构建时失败。

4 个答案:

答案 0 :(得分:1)

您的构建设置似乎没有生成私有访问程序集。结果,使用指令或程序集引用错误导致丢失。您可以在构建过程中查看Publicize工具以生成私有访问器。在那里提到

  

生成的组件也是已知的   作为私人访问者。你也可以   从中生成私有访问器   IDE,但您可以使用publicize.exe   而是在自动化,脚本和   构建场景。

我在一些测试中也使用私有访问器,并使用TFS TeamBuild和MSTest。私有访问器在构建期间生成。我没有手动做任何事情。

答案 1 :(得分:0)

您是否偶然在本地正确设置了[assembly:InternalsVisibleTo],但在构建系统上却没有错误设置?

(另外,Assert.AreSame()可能更合适)。

答案 2 :(得分:0)

您提到私有访问者,所以我假设您使用Reflection公开一些私有成员进行单元测试?

如果是这种情况,那么你必须明白偷看私人成员需要授予某些权利。或者,一个流氓.NET程序可能会篡改它想要的任何程序集它想要。

您确定用户Cruise Control正在运行吗?随后,构建运行程序和测试运行器CruiseControl将在.NET运行时给出“ReflectionPermission”或“完全信任”的帐户下运行?

要查看/ google的地方是构建服务器上的 machine.config 设置,Cruise Control自己的web.config(不知道是否有一个,因为我没有长时间使用CC时间)和最后(并且最不可能),测试运行器和被测试应用程序本身的app.config文件。

否则,我建议你使用@Mehmet Aras建议的宣传工具。

答案 3 :(得分:0)

就像穆罕默德的回答一样好,我担心我能让这个工作的唯一方法就是安装视觉工作室。安装完成后,msbuild开始为我生成访问器。不是一个理想的解决方案,但至少我可以继续前进。