Make方法只能从单元测试中调用

时间:2015-11-20 12:19:46

标签: c# unit-testing methods interface

是否可以编写只能通过单元测试调用的方法?我的问题是我们的框架包含很多Singleton类,这使得单元测试很难一段时间。我的想法是创建一个这样的简单界面:

public interface IUnitTestClearable
{
    void ClearForUnitTest();
}

将调用此方法"重置"用于更好地处理单元测试的单例实例。但是这个方法只能从单元测试类/实例中调用。这可能吗?

3 个答案:

答案 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

https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

答案 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();
}

利润