我有一堆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
测试,该测试将在所有测试完成后清空连接。
答案 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();
}
}
}
}