2017-04-20 51 views
-1

我有一個Singleton類,像這樣:我怎樣才能用NSubstitute模擬一個單身人士課程?

public class XConnector : IXConnector 
     { 

      private static readonly Lazy<XConnector> instance = 
        new Lazy<XConnector>(() => new XConnector()); 

      public static XConnector Instance => instance.Value; 

      private XConnector() 
      { 
      } 

      public async Task<XConnector> GetData(XConnector con) 
      { 
      } 
     } 

我怎麼能嘲笑這個類NSubstitute?

在另一方面

:我想是這樣的

var target = Substitute.For<IXConnector>(); 

這是一個快速觀看,當我調試代碼

enter image description here 任何幫助是值得歡迎的。

+1

這是什麼問題? 'Substitute.For ();'如果'IXConnector'是一個接口(我猜想)應該完美的工作。 – HimBromBeere

+0

您可以使用Mark Seemann的環境上下文模式。這將允許您注入一個實例,同時仍然提供Singleton的意圖。 –

+0

@HimBromBeere測試這個代碼..並在_target字段中看到,你會看到這是空的 – Coding4Fun

回答

4

我不記得環境上下文模式的實現,我沒有這本書。然而,這將是這個樣子:

public class XConnector : IXConnector 
{ 
    private static IXConnector _instance = new XConnector(); 

    private XConnector() 
    { 
    } 

    public static IXConnector Current 
    { 
     get 
     { 
      return _instance; 
     } 
     set 
     { 
      // Think about thread-safety 
      // Check for null? 
      _instance = value; 
     } 
    } 

    public async Task<XConnector> GetData(XConnector con) 
    { 
    } 
} 

然後測試可以這樣做:

XConnector.Current = Substitute.For<IXConnector>(); 

你的功能代碼可以做到這一點,與默認實例,或假的工作:

XConnector.Current.GetData(...); 
+0

你把我放在正確的道路上。但我不認爲我有我的答案。因爲該實例是隻讀的 – Coding4Fun

+6

這是必需的嗎?如果你想用一個假冒來代替這個實例,你需要一些方法來設置它,而當前的設計排除了一個構造函數。 –