处理在 NUnit 测试之间共享的单例实例

Disposing a singleton instance shared between NUnit tests

我有一堆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 测试,它会在所有测试完成后清空连接。

Setup Fixture 可以解决这个问题。一个警告是我需要在程序集的任何测试之后将 class 放在测试名称空间之外 到 运行。

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

using NUnit.Framework;
// ReSharper disable CheckNamespace

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