2011-12-13 42 views
2

我是新來NMock和嘲笑一般。 是否有可能重新定義期望?事實上,我想用許多方法來模擬一個接口。 所以我決定將常用方法的期望因數分解成1000次而不必寫出它們。 我的問題如下: 我有一個存根加載文件的方法。 在大多數情況下,模擬對此方法不起任何作用。 所以我因式分解的[設置]NMock:重新定義方法期望

Stub.On(myMock).Method("Load").Will(Return.Value(True)); 

的期望,但在測試情況下,我想測試使用的模擬對象以及響應異常,所以我把我的測試方法:

Stub.On(myMock).Method("Load").Will(Throw.Exception(new FileNotFoundException())); 

當我調試測試時,我看到Load方法返回True。 我可以理解這個,但是可以重置方法的exceptation還是重新定義它?

回答

2

我從來沒有找到一個很好的方法來做到這一點。我必須使用自定義操作來根據特定呼叫的需要設置值。事情是這樣的:

[TestFixture] 
public class Testing 
{ 
    public interface IXyz 
    { 
     bool Load(); 
    } 

    public class DelegateAction<T> : NMock2.IAction 
    { 
     private Func<T> _resultFunc; 

     public void SetResultFunction(Func<T> func) 
     { 
      _resultFunc = func; 
     } 

     public DelegateAction(Func<T> resultFunc) 
     { 
      _resultFunc = resultFunc; 
     } 


     public void Invoke(Invocation invocation) 
     { 
      invocation.Result = _resultFunc(); 
     } 

     public void DescribeTo(TextWriter writer) 
     { 
     } 
    } 

    private bool _result = true; 
    private DelegateAction<bool> _action; 

    [Test] 
    public void ResetTheReturnValue() 
    { 
     //would be done in general setup... 
     Mockery mocker = new Mockery(); 
     IXyz test = mocker.NewMock<IXyz>(); 
     _action = new DelegateAction<bool>(() => _result); 
     Stub.On(test).Method("Load").Will(_action); 

     //Reset for test.... - if you comment it out true is 
         //returned as default and the test passes 
     _action.SetResultFunction(() => { throw new Exception();}); 

     Assert.IsTrue(test.Load()); 
    } 
} 

通常我不會讓要設定的功能,我想一般只想ocasionally返回不同的值,它可以通過改變現場進行。確保在測試結束時重置事物。

是的,我知道這是非常糟糕的,如果有人知道一個更好的方式,會喜歡更好的方式。順便說一句 - 如果你沒有卡住NMock,你可能會想看看像Moq這樣的東西。我傾向於有更好的結果,但顯然你的里程可能會有所不同:)

+0

謝謝你......幹得好!好的,這並不像我想要的那麼簡單...... 我無法使用Moq,因爲我的目標是.net 2.0。 我想測試犀牛嘲笑,但我沒有找到如何下載它,所以我決定這不是一個好的選擇! – boblemar

+0

我知道 - 應該有一個更簡單的方法來做到這一點,但我懷疑沒有。我認爲NMock2缺乏多種方法 - 這是不太重要的方法之一。就我而言,使用字符串進行方法命名等操作無法使用。不幸的是,我目前與之合作的團隊不同意。 –

+0

我認爲你可以在這裏下載rhino mocks:http://builds.hibernatingrhinos.com/builds/Rhino-Mocks這真的很好 - 我更喜歡Moq,但是當Moq不可用時會使用Rhino。 –