2

我是 NMock 的新手,一般都在嘲笑。是否可以重新定义期望?事实上,我想用许多方法模拟一个接口。所以我决定分解常用方法的期望,而不是把它们写 1000 次。我的问题如下:我有一个加载文件的存根方法。在大多数情况下,mock 不会对这个方法做任何事情。所以我在 [SetUp] 中分解了期望

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

但是,在一个测试用例中,我想测试使用 mock 的对象对异常的响应是否良好,所以我输入了我的测试方法:

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

当我调试测试时,我看到 Load 方法返回 True。我可以理解这一点,但是是否可以重置方法的异常或重新定义它?

4

1 回答 1

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());
    }
}

我通常不会允许设置函数,因为我通常只想偶尔返回一个不同的值,这可以通过更改字段来完成。确保在测试结束时重新设置。

是的,我知道这很糟糕,如果有人知道,我会喜欢更好的方法。顺便说一句 - 如果你不喜欢 NMock,你可能想看看像 Moq 这样的东西。我倾向于用它有更好的结果,虽然很明显你的里程可能会有所不同:)

于 2011-12-13T12:47:23.223 回答