如何通过Microsoft Fakes用ConcurrentDictionary(C#)填充长时间的外部依赖关系

本文关键字:长时间 填充 外部 关系 依赖 Microsoft 何通过 Fakes ConcurrentDictionary | 更新日期: 2023-09-27 18:26:31

在我需要测试的代码中发现了这样的外部依赖:

var something = GConfig.SConfig[Type.ServiceType1].Names;

该部分的代码如下:

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
namespace Class
{
    public sealed class GConfig
    {
        public ConcurrentDictionary<Type, GConfigIt> SConfig { get; set; }
        public GConfig()
        {
            SConfig = new ConcurrentDictionary<Type, GConfigIt>();
            throw new InvalidOperationException("Error");
        }
    }
    public enum Type
    {
        ServiceType1,
        ServiceType2
    }
    public class GConfigIt
    {
        public List<string> Names { get; set; }
        public GConfigIt()
        {
            Names = new List<string>();
        }
    }
}

我需要填补这种依赖,但我自己找不到完整的解决方案,只有一部分:

对于GConfigIt(和匀场名称):Fakes.ShimGConfigIt.AllInstances.NamesGet

用于匀场SConfig:Fakes.ShimGConfig.AllInstances.SConfigGet

但我找不到连接,如何充分填充。

附言:我只是一个测试人员,不能更改现有的代码。为了做出改变,我需要说服开发人员这样做(即GConfig的额外接口),但他们必须确保这不是一个仅仅为了"简单测试"或"为测试而测试"的改变,他们真的需要这样做

好吧,所以你实际上走在了正确的轨道上。从Fakes.ShimGConfig.AllInstances.SConfigGet开始,一旦成功,就需要填充字典。

可能是像Fakes.ShimConcurrentDictionary.AllInstances.ItemGetType这样的东西,你可以让它返回你想要的任何GConfigIt,可能是一个存根。

您可以设置所述存根的属性,也可以对名称执行以前所做的操作。

我假设并发字典可以填充;如果没有,你仍然没有被卡住。只需填充SConfigGet即可返回SConfigGet的存根,您可以在其中输入有效值。这甚至可能比其他方式更好,因为您对实现的假设更少。

如何通过Microsoft Fakes用ConcurrentDictionary(C#)填充长时间的外部依赖关系