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