我使用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);
}
}
答案 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的人,您有三个 选项:
- 使用Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject类来帮助访问代码中的内部和私有API。 这是在 Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll程序集。
- 创建一个反射框架,该框架能够反映您的代码以访问内部或私有API。
- 如果您尝试访问的代码是内部代码,则可以使用InternalsVisibleToAttribute访问API,以便进行测试 代码可以访问内部API。
醇>
答案 1 :(得分:1)
我没有使用此功能,但是当我第一次开始学习单元测试时,我确实使用过它。通常,单元测试应该测试该类的公共表面。如果从这个原则开始,就不需要访问者类。
但是如何在类中测试重要的私有逻辑呢?我通常将私有方法提取到辅助类中,在那里它们成为公共方法(想想“单一责任原则”)。当然,作为公共方法,它们在没有访问者类的情况下变得可测试。然后原始类获取辅助类的私有实例。
除了让您避免测试中的访问者类之外,此方法还可以更轻松地在测试中使用模拟对象。当你测试原始类时,不是给它“真正的”辅助类,而是给它一个模拟实例。这将原始类的测试与助手类中的逻辑分离:如果在助手类中引入了错误,则辅助类的测试失败,但原始类的测试不受影响。