NMock: переопределить метод ожидания - PullRequest
2 голосов
/ 13 декабря 2011

Я новичок в NMock и насмешки в целом.Можно ли переопределить ожидание?На самом деле, я хочу издеваться над интерфейсом многими способами.Поэтому я решил проанализировать общие ожидания по методам, чтобы не писать их 1000 раз.Моя проблема заключается в следующем: у меня есть метод заглушки, который загружает файл.В большинстве случаев макет ничего не сделает для этого метода.Поэтому я учел ожидание в [SetUp]

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

Но, в тестовом примере я хочу проверить, что объект, использующий макет, хорошо реагирует на исключение, поэтому я добавил в свой метод теста:

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

Когда я отлаживаю тест, я вижу, что метод Load возвращает True.Я могу понять это, но возможно ли сбросить исключение для метода или переопределить его?

1 Ответ

2 голосов
/ 13 декабря 2011

Я никогда не находил хороший способ сделать это. Мне пришлось использовать пользовательское действие, чтобы установить значение, необходимое для конкретного вызова. Примерно так:

[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. Я имею тенденцию иметь лучшие результаты с ним, хотя, очевидно, ваш пробег может варьироваться:)

...