2009-10-26 226 views
2

我是使用Moq的新手,我找不到這樣做的方法。 我有一個generateId私有方法,稱爲Moq代理單元測試

/// <summary> 
/// Generates a call Id for external interfaces 
/// </summary> 
/// <returns></returns> 
private string GenerateCallId() 
{ 
return "EX" + SharedServicesClientProxy.Instance.GenerateId().ToString(); 
} 

我想單元測試這種方法,因爲這個原因,我需要模擬代理。 SharedServicesClientProxy只是一個實現接口ISharedServices但添加單例的對象。我想測試所有的字符串是否正確地返回了一個以「EX」開頭的字符串。這是我的單元測試,使用Moq

/// <summary> 
    /// A test for GenerateCallId 
    /// A CallId for external systems should always start by "EX" 
    ///</summary> 
    [TestMethod()] 
    [DeploymentItem("myDll.dll")] 
    public void GenerateCallIdTest() 
    { 
     myService_Accessor target = new myService_Accessor(); 
     var SharedServicesClientProxy = new Mock<ISharedServices>(); 
     SharedServicesClientProxy.Setup(x => x.GenerateId()).Returns(5396760556432785286); 
     string actual; 
     string extCallIdPrefix = "EX"; 
     actual = target.GenerateCallId(); 
     Assert.IsTrue(actual.StartsWith(extCallIdPrefix)); 
    } 

我想我在錯誤的地方做我的模擬?

以更一般的方式,我如何模擬一個將被我測試的方法調用的對象? 爲如:

 /// <summary> 
     /// dummy test 
     ///</summary> 
     [TestMethod()] 
     [DeploymentItem("myDll.dll")] 
     public void Foo() 
     { 
      myService_Accessor target = new myService_Accessor(); 
      boolexpected = false; 
      actual = target.Foo(); 
      Assert.IsTrue(actual,expected); 
     } 

     /// <summary> 
     /// Foo 
     /// </summary> 
     /// <returns></returns> 
     private bool Foo() 
     { 
      return this.Bar(); 
     } 

我需要MOQ酒吧,但如果我需要做的呢? 謝謝, Seb

回答

6

在繼續之前搜索術語「依賴注入」。

您對SharedServicesClientProxy.Instance有依賴關係,這是一個Singleton。這會導致測試隔離問題,因爲您會在測試中重複使用相同的實例,並容易出現狀態剩餘問題。

我會通過公共接口勸注入這樣的依賴關係(和OT-你不應該測試私有方法......考驗。在那裏,它是我的系統.. :)

public class AnonClass 
{ 
    ISharedServices _sharedServices; 
    AnonClass(ISharedServices sharedServicesObj) 
    { 
    _sharedServices = sharedServicesObj; 
    } 
    public string GenerateCallId() 
    { 
    return "EX" + _sharedServices.GenerateId().ToString(); 
    } 
} 

重新接線當前的代碼來創建目標類這樣

var class = new AnonClass(SharedServicesClientProxy.Instance); 

在您的測試,通過在模擬對象,而不是由辛格爾頓

返回的對象