Частичная насмешка - игнорирование ожиданий (Rhino Mocks)
Я пытаюсь проверить класс, подобный примеру ниже:
public class Service : IService
{
public string A(string input)
{
int attemptCount = 5;
while (attemptCount > 0)
{
try
{
return TryA(input);
}
catch (ArgumentOutOfRangeException)
{
attemptCount--;
if (attemptCount == 0)
{
throw;
}
// Attempt 5 more times
Thread.Sleep(1000);
}
}
throw new ArgumentOutOfRangeException();
}
public string TryA(string input)
{
// try actions, if fail will throw ArgumentOutOfRangeException
}
}
[TestMethod]
public void Makes_5_Attempts()
{
// Arrange
var _service = MockRepository.GeneratePartialMock<Service>();
_service.Expect(x=>x.TryA(Arg<string>.Is.Anything)).IgnoreArguments().Throw(new ArgumentOutOfRangeException());
// Act
Action act = () => _service.A("");
// Assert
// Assert TryA is attempted to be called 5 times
_service.AssertWasCalled(x => x.TryA(Arg<string>.Is.Anything), opt => opt.Repeat.Times(5));
// Assert the Exception is eventually thrown
act.ShouldThrow<ArgumentOutOfRangeException>();
}
Частичная насмешка, кажется, не принимает мои ожидания. Когда я запускаю тест, я получаю сообщение об ошибке ввода. Когда я отлаживаю, я вижу, что фактическая реализация метода выполняется вместо ожидания.
Я правильно делаю этот тест? Согласно документации ( http://ayende.com/wiki/Rhino%20Mocks%20Partial%20Mocks.ashx): "Частичная имитация вызовет метод, определенный в классе, если вы не определите ожидание для этого метода. Если у вас есть определил ожидание, он будет использовать нормальные правила для этого ".
1 ответ
Важно отметить, что фреймворки-макеты, такие как Rhinomocks, Moq и NSubstitute, используют в.NET функцию DynamicProxy, которая динамически генерирует производный класс макета в памяти. Занятия должны:
- быть интерфейсом; или же
- незапечатанный класс с конструктором без параметров; или же
- происходит от MarshalByRefObject (moq отошел от этой функции)
Методы должны быть частью интерфейса или быть виртуальными, чтобы альтернативные варианты поведения могли быть заменены во время выполнения.