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用作测试框架。 请忽略Theory
和InlineData
东西 – 它只是摆脱不必要的测试设置的另一种方法。
这是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
上述就是C#学习教程:Rhinomocks – 嘲笑代表分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1031473.html