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

C# 处理NUnit测试之间共享的单例实例,c#,redis,nunit,stackexchange.redis,nunit-3.0,C#,Redis,Nunit,Stackexchange.redis,Nunit 3.0,我有一堆NUnit验收测试(即,不是单元测试),需要在执行过程中连接到几个Redis实例 StackExchange.Redis最佳实践建议存储和重用ConnectionMultiplexer实例(请参见此处),因此我提出了一个允许重用ConnectionMultiplexer对象的单例: internal static class RedisConnectionCache { // concurrency locks omitted for simplicity private

我有一堆NUnit验收测试(即,不是单元测试),需要在执行过程中连接到几个Redis实例

StackExchange.Redis最佳实践建议存储和重用ConnectionMultiplexer实例(请参见此处),因此我提出了一个允许重用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;
    }
}
不幸的是,由于这一切都发生在许多不同的NUnit测试装置中,所以我没有一个好方法来处理我的Redis连接字典

如果我需要在同一测试运行中重用不同测试装置之间的连接对象,我的选项是什么?
到目前为止,我能想到的最好的方法是
onetimeeardown
测试,在所有测试完成后清空连接。

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

在一般情况下,我的代码与此类似:

using NUnit.Framework;
// ReSharper disable CheckNamespace

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

是的,这就是方法。在每个
TestFixture
之前,您可以在
OneTimeSetUp
方法中设置
字典
,并在
TearDown
中销毁它。另一个选择是使用单个
TestFixture
类并将其作为部分类使用。然后将
TestFixtures
仅按文件名。请查看Nunit的安装装置。这将允许您在完成整个名称空间的测试或整个程序集的测试后进行拆卸。@Chris谢谢!我已经实施了你的建议,效果很好
using NUnit.Framework;
// ReSharper disable CheckNamespace

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