3

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

2 回答 2

2

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

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

在Visual Studio 2010 的私有访问器的生成 (Publicize) 和代码生成中有一篇博客文章指出不再进一步支持此功能:

我们已停止为 Visual Studio 2010 开发这些功能,并且可能会在后续版本中将它们从产品中删除。这是由于以下原因:

  • 缺乏资源和时间:此版本的重点是改善手动测试人员的体验,因此降低了代码生成和宣传功能的优先级。我们使用的宣传功能还存在其他尚未解决的问题。
  • 语言团队的新功能:由于语言团队对其项目类型和语言进行了修改,我们无法响应他们所做的更改,也无法使用他们引入的新功能。

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

对于那些希望继续测试内部 API 的人,您有以下三种选择:

  1. 使用 Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject 类来帮助访问代码中的内部和私有 API。这可以在 Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll 程序集中找到。
  2. 创建一个反射框架,该框架能够反射您的代码以访问内部或私有 API。
  3. 如果您尝试访问的代码是内部代码,您可以使用 InternalsVisibleToAttribute 访问您的 API,以便您的测试代码可以访问内部 API。
于 2012-08-08T08:23:23.307 回答
1

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

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

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

于 2012-08-03T08:45:10.160 回答