我正在尝试测试类似于以下示例的类:
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):“部分模拟将调用类上定义的方法,除非您定义了对该方法的期望。如果您已经定义了期望,它将使用常规规则。”
答案 0 :(得分:2)
重要的是要注意像Rhinomocks,Moq和NSubstitute这样的模拟框架在.NET中使用一个名为DynamicProxy的功能,它在内存中动态生成模拟的派生类。课程必须:
方法必须是接口的一部分或者是虚拟的,以便在运行时替换替代行为。