【问题标题】:Visual Studio private accessors and checking in codeVisual Studio 私有访问器和签入代码
【发布时间】:2012-08-03 08:27:05
【问题描述】:

我使用 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);
    }
}

【问题讨论】:

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


    【解决方案1】:

    在使用私有访问器一段时间后,在与我们的源代码版本控制系统进行一些分支和合并后,我在编译代码时遇到了一些麻烦。

    我开始研究这个主题,并在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. 创建一个能够反射您的代码以访问内部或私有 API 的反射框架。
    3. 如果您尝试访问的代码是内部代码,您可以使用 InternalsVisibleToAttribute 访问您的 API,以便您的测试 代码可以访问内部 API。

    【讨论】:

      【解决方案2】:

      我不使用此功能,尽管在我刚开始学习单元测试时我确实使用了一段时间。一般来说,单元测试应该测试类的公共表面。如果你从这个原则开始,应该不需要访问器类。

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

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

      【讨论】:

      • 是的,我确实从测试私有方法中得到了一种有趣的感觉。我现在使用模拟来包装有问题的方法并以这种方式完成。不过,很高兴知道如何在 VS 中做到这一点(并保持项目的可移植性)。
      猜你喜欢
      • 2017-07-04
      • 2012-07-06
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      相关资源
      最近更新 更多