Visual Studio私有访问器和检入代码

时间:2012-08-03 08:27:06

标签: c# visual-studio-2010 unit-testing reflection shadowing

我使用Visual Studio自己的“创建单元测试...”选项在私有方法上生成单元测试。

很好,它可以工作,但如果我现在尝试检查我的代码,我会破坏构建,因为VS已经在AppData / Local / Temp中创建了一个私有访问器类,需要构建。如果我尝试将此文件放在我的源代码树中,它将无法编译,因为编译器说它“必须定义一个主体”。真的不明白这个反射云雀......

这是访问者类:

#region Assembly AgentConfiguration_Accessor.exe, v4.0.30319
// C:\Projects\AgentConfigurationTests\obj\Debug\AgentConfiguration_Accessor.exe
#endregion

using Agent.ConfigurationData;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

namespace Agent.AgentConfiguration
{
    [Shadowing("Agent.AgentConfiguration.AgentConfigurationGui")]
    public class AgentConfigurationGui_Accessor : BaseShadow
    {
        protected static PrivateType m_privateType;

        [Shadowing(".ctor@0")]
        public AgentConfigurationGui_Accessor();
        public AgentConfigurationGui_Accessor(PrivateObject value);

        [Shadowing("_agentPaths")]
        public AgentPaths _agentPaths { get; }
        [Shadowing("_agentServiceName")]
        public static string _agentServiceName { get; set; }
        [Shadowing("UpdateStatus@1")]
        public void UpdateStatus(string statusMessage);
    }
}

2 个答案:

答案 0 :(得分:2)

在使用私有访问器一段时间之后,在使用我们的Souce Code Versioning系统进行分支和合并之后,我在编译代码时遇到了一些麻烦。

我开始研究这个主题,并在Visual Studio Team Test博客中找到了一篇文章。据我了解,你应该再使用Private Accessor类。

Generation of Private Accessors (Publicize) and Code Generation for Visual Studio 2010中有一篇博客文章指出此功能不再受支持

  

我们已停止为Visual Studio 2010和   可能会在以下版本中将其从产品中删除。这个到期了   原因如下:

     
      
  • 缺乏资源和时间:此版本的重点是改善手动测试人员的体验,因此优先考虑   代码生成和宣传功能已降低。有   我们的宣传功能也是其他问题   利用尚未解决的问题。
  •   
  • 语言团队的新功能:由于语言团队已经对他们的项目类型和语言进行了修改,我们一直都是   无法回应他们所做的改变,但却无法做出改变   使用他们引入的新功能。
  •   

当然,有关于你可以做什么的建议:

  

对于那些希望继续测试内部API的人,您有三个   选项:

     
      
  1. 使用Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject类来帮助访问代码中的内部和私有API。   这是在   Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll程序集。
  2.   
  3. 创建一个反射框架,该框架能够反映您的代码以访问内部或私有API。
  4.   
  5. 如果您尝试访问的代码是内部代码,则可以使用InternalsVisibleToAttribute访问API,以便进行测试   代码可以访问内部API。
  6.   

答案 1 :(得分:1)

我没有使用此功能,但是当我第一次开始学习单元测试时,我确实使用过它。通常,单元测试应该测试该类的公共表面。如果从这个原则开始,就不需要访问者类。

但是如何在类中测试重要的私有逻辑呢?我通常将私有方法提取到辅助类中,在那里它们成为公共方法(想想“单一责任原则”)。当然,作为公共方法,它们在没有访问者类的情况下变得可测试。然后原始类获取辅助类的私有实例。

除了让您避免测试中的访问者类之外,此方法还可以更轻松地在测试中使用模拟对象。当你测试原始类时,不是给它“真正的”辅助类,而是给它一个模拟实例。这将原始类的测试与助手类中的逻辑分离:如果在助手类中引入了错误,则辅助类的测试失败,但原始类的测试不受影响。