Модульное тестирование CacheManager - PullRequest
5 голосов
/ 24 июня 2010

У меня есть класс CacheManager, в котором хранится статический словарь со всеми видами кэшированных данных. Однако, поскольку этот словарь является статическим, он заполняется данными из других модульных тестов. Это удерживает меня от модульного тестирования, независимо от того, является ли CacheManager пустым при инициализации, и нарушает принципы модульного тестирования.

Есть идеи, как создать для этого подходящий юнит-тест?

Код

public class CacheManager
{
   private static readonly Dictionary<ICacheKey, ListCacheItem> cacheEntries =
       new Dictionary<ICacheKey, ListCacheItem>();

   public static Dictionary<ICacheKey, ListCacheItem> CacheEntries
   {
       get
       {
           lock (cacheEntries)
           {
               return cacheEntries;
           }
       }
   }

Ответы [ 2 ]

1 голос
/ 24 июня 2010

Краткий ответ: вы не можете сделать это правильно.Модульное тестирование и статика не очень хорошо играют вместе, у вас (почти) всегда будут проблемы, подобные той, которую вы упомянули.

Более длинный ответ: лучшим решением будет рефакторинг вашего кода.Даже если вам нужно поведение синглтона, у вас есть несколько вариантов (например, внедрение зависимости).Рекомендация Дэвида, конечно, также является вариантом, который, по крайней мере, позволит вам протестировать ваш кэш, но у вас могут возникнуть проблемы, когда вы хотите протестировать остальную систему.

Если по какой-то причине вы хотите придерживатьсяваш текущий дизайн вы все еще можете иметь некоторые (не обязательно хорошие) обходные пути.Некоторые примеры:

Проще всего добавить метод «cleanCache».В некоторых ситуациях это может быть даже полезно для остальной части системы, и каждый из ваших тестов может также сделать это в качестве первого шага (в «setup / beforeTest или аналогичных методах»).

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

Эти хаки, вероятно, будут работать до тех пор, пока вы не будете выполнять свои тесты параллельно.

1 голос
/ 24 июня 2010

Как правило, это не очень хорошая идея с точки зрения тестирования. Сделав члены CacheManager статичными, вы никогда не сможете изолировать их таким образом, чтобы было удобно проводить модульное тестирование.

Возможно, лучшим решением будет Singleton Pattern . Чтобы сделать это, избавьтесь от статических модификаторов на членах CacheManager. Тогда в вашем приложении может быть один статический экземпляр, который будет использоваться всеми остальными. Следовательно, в своем модульном тесте вы можете создать новый экземпляр класса, который можно тестировать изолированно, но при этом иметь желаемую функциональность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...