布置NUnit测试之间共享的单例实例

时间:2019-02-04 15:34:43

标签: c# redis nunit stackexchange.redis nunit-3.0

我有一堆NUnit接受测试(不是 unit 测试),在执行过程中需要连接到多个Redis实例。

StackExchange.Redis最佳实践建议存储和重用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 :(得分:1)

Setup Fixture在这里起作用。一个警告是,我需要将类放在测试名称空间之外,以便在程序集中的任何测试之后运行。

以通用方式,我的代码最终类似于以下内容:

using NUnit.Framework;
// ReSharper disable CheckNamespace

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