gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:04:54 25 4
gpt4 key购买 nike

我有一堆 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 在这里起到了作用。需要注意的是,我需要将类放在测试命名空间之外,以便在程序集中的任何测试之后运行。

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

using NUnit.Framework;
// ReSharper disable CheckNamespace

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

关于c# - 处理在 NUnit 测试之间共享的单例实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54519444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com