Rhinomocks – 嘲笑代表

public interface IServiceInvoker { R InvokeService(Func invokeHandler) where T : class; } public class MediaController : Controller { private IServiceInvoker _serviceInvoker; public MediaController(IServiceInvoker serviceInvoker) { _serviceInvoker = serviceInvoker; } public JsonResult GetAllMedia() { var media = _serviceInvoker.InvokeService<IMediaService, List>(proxy => proxy.GetAllMediaInJson()); JsonResult jsonResult = new JsonResult(); jsonResult.Data = media; jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet; return jsonResult; } [TestClass] public class MediaControllerTests { [TestMethod] public void GetAllMedia() { JsonResult data; var serviceInvoker = MockRepository.GenerateStub(); var media = CreateSeveralMedia(); serviceInvoker.Stub(c => c.InvokeService<IMediaService, List>(p => p.GetAllMediaInJson())).Return(media); data = new MediaController(serviceInvoker).GetAllMedia(); serviceInvoker.VerifyAllExpectations(); Assert.IsNotNull(data); } 

}

我正在对服务进行存根并返回一个集合。 当我运行此测试时,媒体为空。 任何想法,我如何设置这个模拟的期望?

刚刚找到了解决方案。 它似乎有点难看,但它是第一次迭代,可能很快就会出现更优雅的版本。 我的想法是创建另一个存根并匹配它的Func<> :我将为我的用例提供代码:

 [Theory] [InlineData(342, 31129, 3456)] public void should_call_service_invoker_and_return_result(int number1, int number2, int expected) { var calculator = MockRepository.GenerateStub(); calculator.Stub(_ => _.Add(number1, number2)).Return(expected); var serviceInvoker = MockRepository.GenerateStub>(); serviceInvoker .Stub(_ => _.Invoke(Arg>.Matches(d => d(calculator) == calculator.Add(number1, number2)))) .Return(expected); var serviceConsumer = new ServiceConsumer(serviceInvoker); var actual = serviceConsumer.GetAddResultFor(number1, number2); Assert.Equal(expected, actual); } 

xUnit + extensions用作测试框架。 请忽略TheoryInlineData东西 – 它只是摆脱不必要的测试设置的另一种方法。

这是SUT的代码:

 public class ServiceConsumer { private readonly ServiceInvoker serviceInvoker; public ServiceConsumer(ServiceInvoker serviceInvoker) { this.serviceInvoker = serviceInvoker; } public int GetAddResultFor(int number1, int number2) { return serviceInvoker.Invoke(_ => _.Add(number1, number2)); } } public class ServiceInvoker { public virtual R Invoke(Func func) { throw new NotImplementedException(); } } public interface ICalculator { int Add(int number1, int number2); } 

希望这会有所帮助。 欢迎任何有关如何添加更多美容的建议:)

unit testing中的lambda编译为类级方法(unit testing中的方法)。 在你的控制器中,一个不同的lambda编译成一个类级方法(在控制器内部)。 unit testing中设置的存根与控制器中正在执行的存根不匹配,因此Rhino Mocks返回默认值(null)。 更多信息: http : //groups.google.com/group/rhinomocks/browse_frm/thread/a33b165c16fc48ee?tvc = 1