2011-09-16 66 views
0

我的應用程序有一個ProviderFactory靜態類,它具有靜態實用程序方法,可以將類似於記錄器的事件的靜態實例傳回。我的應用程序的其餘部分可以從任何地方抓取記錄器的引用,而無需傳入記錄器(通用設計實踐)。使用Moq在模擬對象上驗證間接調用的方法

因此,我的應用程序的另一部分DbCacheProvider具有方法,可以在內部調用記錄器,從而獲得對工廠記錄器的引用,然後向其發出調用。

我的問題是,使用Moq,我想驗證記錄器上的方法正在被DbCacheProvider中的方法調用。當我將一個模擬記錄器作爲參數傳遞給DbCacheProvider時,我可以使用依賴注入來做到這一點,但我沒有將記錄器傳入(我不想)。那麼,我將如何驗證DbCacheProvider正在對記錄器進行調用?

回答

0

如果您不想通過構造函數傳入記錄器,則需要在運行單元測試時更改ProviderFactory以返回模擬記錄器。

反正有幾個原因,它經常建議建立依賴注入:

  1. 你的測試更簡單,不涉及定製工廠finagling
  2. IoC框架一樣團結,Ninject和當Autofac以這種方式設置依賴關係時,可以輕鬆創建對象。如果以這種方式設置所有對象,框架將完成創建正確對象並將它們傳遞給您的所有重要工作。依賴注入是自動完成的,不會對您造成負擔。
0

沒有答案老問題,我也有類似的問題,解決它像這樣:

我有下面的示例代碼和需要驗證,不僅是所謂的方法,但被稱爲具有特定值。

public interface ILog 
{ 
    void Info(string message); 
} 

public interface ILogFactory 
{ 
    ILog GetLogger(); 
} 

這是被測試的類,其中接口項目被注入:

public class NewAction 
{ 
    readonly ILogFactory _logger; 

    public NewAction(ILogFactory logger) 
    { 
     _logger = logger; 
    } 

    public void Step1() 
    { 
     _logger.GetLogger().Info("Step 1"); 
    } 

    public void Step2() 
    { 
     _logger.GetLogger().Info("Step 2"); 
    } 
} 

這顯然是我的實際代碼非常簡單的觀點,但我需要驗證第一步和第二步行爲如預期,並將正確的值傳遞給Log,這意味着我還需要確保它們以正確的順序發生。我的測試:

[TestClass] 
public class UnitTest1 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     // Arrange 
     var log = new Mock<ILog>(); 

     var factory = new Mock<ILogFactory>(); 
     factory.Setup(l => l.GetLogger()).Returns(log.Object); 

     // Act 
     var action = new NewAction(factory.Object); 
     action.Step1(); 
     action.Step2(); 

     // Assert 
     factory.Verify(l => l.GetLogger()); 
     log.Verify(l => l.Info(It.Is<string>(s => s == "Step 1"))); 
     log.Verify(l => l.Info(It.Is<string>(s => s == "Step 2"))); 
    } 
} 

希望這會有所幫助。

相關問題