代码之家  ›  专栏  ›  技术社区  ›  Odd

使用msbuild时不生成专用访问器

  •  4
  • Odd  · 技术社区  · 16 年前

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

    mytest.cs(96,13):错误cs0246: 类型或命名空间名称'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 回复  |  直到 16 年前
        1
  •  1
  •   Mehmet Aras    16 年前

    您的构建安装程序似乎没有生成专用访问器程序集。因此,使用指令或程序集引用错误会导致该代码丢失。你可以看看 Publicize 用于在生成过程中生成专用访问器的工具。这里提到

    生成的程序集也已知 作为私人访问器。你也可以 从生成专用访问器 但可以使用publicize.exe 而不是自动化、脚本编写和 构建方案。

    我在一些测试中也使用私有访问器,并使用tfs teambuild和mstest。在生成期间生成专用访问器。我不需要手动操作。

        2
  •  0
  •   anthony    16 年前

    在您的构建系统上,您是否偶然在本地正确设置了[assembly:InternalsVisibleTo]但设置不正确?

    (另外,assert.aresame()可能更合适)。

        3
  •  0
  •   chakrit Dutchie432    16 年前

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

    如果是这样,那么你必须理解 窥视私人成员需要授予一定的权利。 或者,一个流氓.NET程序可以用它想要的任何程序集篡改它想要的任何东西。

    您确定用户Cruise Control正在运行,并且随后,Build Runner和Test Runner CruiseControl启动是在给定的帐户下运行的吗? ReflectionPermission 还是来自.NET运行时的“完全信任”?

    谷歌搜索的地方是 机器配置 构建服务器上的设置,Cruise Control自己的web.config(不确定它是否有一个,因为我已经很久没有使用cc了),最后(至少可能),测试运行程序和测试应用程序本身的app.config文件。

    否则,我建议您使用@mehmet aras建议的宣传工具。

        4
  •  0
  •   Odd    16 年前

    尽管Mehmet的答案很好,但恐怕我唯一能让它工作的方法就是安装Visual Studio。安装后,msbuild开始为我生成访问器。不是一个理想的解决方案,但至少我可以继续前进。