Юнит тестирование синглетонов - PullRequest
11 голосов
/ 05 мая 2011

У меня есть синглтон, который содержит ссылку на объект статистики.

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

Мне кажется, что когда я выполняю Program.Main (), все начинается заново между юнит-тестами, но каким-то образом запоминает результаты последнего теста.

Как мне написать модульные тесты, которые будут изолированы друг от друга (я не хочу, чтобы функции clean () - я хочу, чтобы он начинался заново с новым «всем»),

Ответы [ 5 ]

19 голосов
/ 05 мая 2011

Краткая версия: не пишите свои синглтоны как синглтоны. Запишите их как обычные классы и вызовите их через контейнер Inversion of Control, в котором вместо этого вы настроили класс как одиночный.

Таким образом, вы можете просто провести модульное тестирование класса, и если вы решите сегодня или завтра, что синглтон не является подходящим образом жизни для класса, просто измените конфигурацию контейнера IoC.

4 голосов
/ 05 мая 2011

Я написал пост об этом здесь: http://pvlerick.github.io/2017/03/how-to-get-rid-of-a-singleton

TL; DR:

  1. Извлеките интерфейс из Singleton (даже если у вас его нет) изаставить ваш класс работать с этим интерфейсом вместо экземпляра Singleton;
  2. В зависимости от того, являетесь ли вы владельцем Singleton или нет, вы можете заставить его реализовать этот интерфейс или вам понадобится простой адаптер.
1 голос
/ 13 января 2017

При попытке проверить сам синглтон может быть возможным следующее решение:

public class Singleton
{
    private static Singleton _Instance;

    public static Singleton getInstance() {
        if (_Instance == null)
        {
            _Instance = new Singleton();
        }

        return _Instance;
    }

    private Singleton()
    {
    }

    public static resetForTesting() {
        _Instance = null
    }
}

Таким образом, в вашей инфраструктуре модульного тестирования вы будете вызывать Singleton.resetForTesting() перед каждым модульным тестом.

Примечание : недостатком этого подхода является отсутствие ограничений на уровне кода, которые не позволяли бы кому-либо вызывать этот метод в рабочем коде, даже если он предназначен только для тестирования кода. Таким образом, вам придется полагаться на документацию, чтобы передать это другим людям.

1 голос
/ 05 мая 2011

посмотрите на это Модульное тестирование с синглетонами

также я бы порекомендовал использовать насмешливые рамки, такие как Moq

для изоляции вашего теста

0 голосов
/ 18 января 2018

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

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