是否可以编写只能通过单元测试调用的方法?我的问题是我们的框架包含很多Singleton
类,这使得单元测试很难一段时间。我的想法是创建一个这样的简单界面:
public interface IUnitTestClearable
{
void ClearForUnitTest();
}
将调用此方法"重置"用于更好地处理单元测试的单例实例。但是这个方法只能从单元测试类/实例中调用。这可能吗?
答案 0 :(得分:8)
您可以在内部创建一个方法,并设置InternalsVisibleTo。这样,您可以为内部提供另一个程序集访问权限
http://geekswithblogs.net/jwhitehorn/archive/2007/11/09/116750.aspx
但蒂姆就在我面前,因为我结束了这个:)
在项目文件AssemblyInfo.cs中,设置
[assembly: InternalsVisibleTo("Application.Test")]
或者如果您有签名的程序集
[assembly: InternalsVisibleTo("Application.Test, PublicKey=KEYHERE")]
答案 1 :(得分:5)
在控制或阻止使用该访问权限的其他事物(ab)的同时提供对单元测试的访问是个好主意。有很多种方法可以做,但最简单的方法是使用InternalsVisibleTo
答案 2 :(得分:1)
您可能不希望将所有私有方法公开给您的单元测试,因为它可能会导致混淆,因此只需为您的单例类添加一个私有方法。
public class MySingleton
{
private void ClearForUnitTest()
{
Console.WriteLine("Cleared.");
}
}
创建要在单元测试中使用的扩展程序。
public static class PrivateExtensions
{
public static void ClearForUnitTest<T>(this T instance)
{
var method = typeof(T).GetMethod("ClearForUnitTest", BindingFlags.NonPublic | BindingFlags.Instance);
method.Invoke(instance, null);
}
}
像使用它一样使用
private static void Main(string[] args)
{
var ms = new MySingleton();
ms.ClearForUnitTest();
}
利润