0

在代碼中,我需要檢測,結果發現這樣的外部依賴:如何通過Microsoft Fakes使用ConcurrentDictionary(C#)來長時間地依賴外部依賴?

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

但是我找不到連接,如何充分墊片。

P.S.我只是一個測試人員,不能改變現有的代碼。爲了做出改變,我需要說服開發人員這樣做(即爲GConfig提供額外的接口),但他們必須確保它不僅僅是用於「簡單測試」或「測試測試」的改變,而且他們確實需要這樣做。

回答

0

好的,所以你實際上是在正確的軌道上。您從Fakes.ShimGConfig.AllInstances.SConfigGet開始,一旦有效,您需要填寫字典。

可能類似Fakes.ShimConcurrentDictionary.AllInstances.ItemGetType,你可以返回任何你想要的GConfigIt,可能是一個存根。

您可以設置所述存根的屬性,也可以對名稱執行之前的操作。

我假設並行字典可以被填充;如果沒有,你仍然沒有被卡住。只需將您的SConfigGet填充以返回一個SConfigGet的存根,您可以在其中輸入有效值。這可能比其他方式更好,因爲你對實現的承擔較少。