处理在 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();
}
}
}
我有一堆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();
}
}
}