2015-11-20 2 views
5

Можно ли написать методы, которые могут быть вызваны только модульными тестами? Моя проблема заключается в том, что наша структура содержит много классов Singleton, что делает тестирование устройства довольно сложным. Моя идея состояла в том, чтобы создать простой интерфейс, как это:Метод метода, который может быть вызван только при модульном тестировании

public interface IUnitTestClearable 
{ 
    void ClearForUnitTest(); 
} 

Этого метод будет вызываться для «перезагрузки» одноплодных случаев для лучшей обработки единичных испытаний. Но этот метод следует вызывать только из классов/экземпляров модульных тестов. Это возможно?

+1

Только помните, что частные методы могут быть вызваны из внешних источников. –

ответ

8

Вы можете сделать метод внутреннего и множество InternalsVisibleTo. Таким образом, вы даете другой сборку доступ к вашим внутренностям

http://geekswithblogs.net/jwhitehorn/archive/2007/11/09/116750.aspx

но Тим был только передо мной, как я закончу это :)

В файле проект, AssemblyInfo.cs установите

[assembly: InternalsVisibleTo("Application.Test")] 

или если у вас есть подписанная сборка

[assembly: InternalsVisibleTo("Application.Test, PublicKey=KEYHERE")] 
+0

Еще правильный ответ, +1 от меня :) –

5

Предоставление доступа к модульным испытаниям при управлении или предотвращении других вещей (ab) с использованием этого доступа является хорошей идеей. Есть несколько способов это можно сделать, но проще всего использовать InternalsVisibleTo

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

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

прибыли в

+0

Кажется, тоже хорошая альтернатива. Спасибо! – BendEg