Удаление одноэлементного экземпляра, совместно используемого тестами NUnit - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть несколько приемочных тестов NUnit (т. Е. Не unit тесты), которые должны подключаться к нескольким экземплярам Redis во время выполнения.

StackExchange.Redis bestпрактики рекомендуют хранить и повторно использовать экземпляры ConnectionMultiplexer (см. здесь: https://stackexchange.github.io/StackExchange.Redis/Basics),, поэтому я придумал этот синглтон, который позволяет повторно использовать объект ConnectionMultiplexer:

internal static class RedisConnectionCache
{
    // concurrency locks omitted for simplicity
    private static readonly Dictionary<string, IConnectionMultiplexer> ConnectionCache = new Dictionary<string, IConnectionMultiplexer>();
    public static IConnectionMultiplexer GetMultiplexer(string connectionString)
    {
        if (ConnectionCache.TryGetValue(connectionString, out var multiplexer))
        {
            return multiplexer;
        }

        var multiplexer= ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(connectionString));
        ConnectionCache.Add(connectionString, multiplexer);

        return multiplexer;
    }
}

, который затем вызывается какэто во многих тестах:

var redisConnection = RedisConnectionCache.GetMultiplexer(connectionString);
var redisDb = redisConnection.GetDatabase(db);
redisDb.KeyDelete(key);

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

При условии, что мне нужно повторно использовать объекты соединения между различными контрольными приборами в одном и том же тестовом прогоне, какие у меня варианты? Пока что лучшее, что я могу придумать, - это OneTimeTearDown тест, который очистит соединения после того, как все тесты будут выполнены.

1 Ответ

0 голосов
/ 30 мая 2019

Настройка Fixture делает свое дело здесь.Одно предостережение: мне нужно было поместить класс вне тестовых пространств имен для запуска после любых тестов в сборке.

В общем случае мой код в конечном итоге был похож на это:

using NUnit.Framework;
// ReSharper disable CheckNamespace

[SetUpFixture]
public class SingletonTeardown
{
    [OneTimeTearDown]
    public void RunAfter()
    {
        if (SingletonType.Instance.IsValueCreated)
        {
            SingletonType.Instance.Value.Dispose();
        }
    }
}
...