2011-10-11 34 views
1

基本上,我有一個方法在我的課上調用Action<T>如果滿足某些條件。我如何進行單元測試以確保動作被調用?Moq +單元測試 - 如何將一個Action傳遞給我的類來測試該Action是否被調用?

public class MyClass<T> 
{ 
    private IDBService _dbService; 

    private Action<T> _action; 

    public MyClass(IDBService dbService, Action<T> action) 
    { 
     if (dbService == null) throw new ArgumentNullException("dbService"); 
     if (action == null) throw new ArgumentNullException("action"); 

     _dbService = dbService; 
     _action = action; 
    } 

    public void CallActionIfPossible(T param) 
    { 
     if (_dbService.IsTopUser) 
      action(param); 
    } 
} 
+0

向我們展示您的當前代碼,以便我們制定一個響應? –

回答

5

好了,基本想法是,Action<T>產生一些狀態變化的地方(如果沒有,有什麼意義呢?)。因此,當條件成立時,單元測試會發生預期的狀態變化,並且當條件不成立時,預期的狀態變化不會發生。

當然,理想情況下,您可以嘲笑Action<T>,這樣狀態測試就非常容易。你不需要起訂量或任何其他嘲諷框架是:

bool actionWasInvoked = false; 
Action<Foo> action = foo => actionWasInvoked = true; 
Bar<Foo> bar = new Bar<Foo>(); 
// set up conditions that should guarantee action is invoked 
bar.M(action); 
Assert.IsTrue(actionWasInvoked); 

bool actionWasInvoked = false; 
Action<Foo> action = foo => actionWasInvoked = true; 
Bar<Foo> bar = new Bar<Foo>(); 
// set up conditions that should guarantee action is NOT invoked 
bar.M(action); 
Assert.IsFalse(actionWasInvoked); 

當然,我不知道您的具體設置。也許你通過建設Baraction,或者你有其他的方式來設置行動。但這個想法應該清楚。

2

Jason的回答很好,但常常被忽視的一個警告是,您經常需要測試一定數量的調用(例如,它不僅被調用,而且僅被調用一次)。所以我經常這樣做:

var callCount = 0; 
Action<Foo> action = _ => callCount++; 
Bar<Foo> bar = new Bar<Foo>(); 
// set up conditions that should guarantee action is invoked 
bar.M(action); 
Assert.That(callCount, Is.EqualTo(1)); 
+0

+1我喜歡這個背後的想法(確保它具有所需的通話量)。 – michael

相關問題