2011-12-13 62 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。 –