我应该在单元测试中使用AutoMapper吗?
我正在为ASP.NET MVC控制器方法编写单元测试。
这些控制器对IMapper
具有依赖性 - 我创建的一个接口用于抽象AutoMapper,通过使用Castle Windsor的构造函数注入传入。
Action方法使用IMapper
从域对象映射到ViewModel对象并再次返回,旨在保持DRY并保持操作方法简洁。
在我的单元测试中,我应该如何
使用正确的绑定配置AutoMapper(它们是使用AutoMapper配置文件构建的,因此可以在网站和单元测试项目之间进行测试和重用),并将其作为适当的IMapper
AutoMapper实现IMapper
。
传递mock对象(我使用MOQ)为IMapper
例如,根据测试(这将意味着重复测试设置代码的一些工作,以确保对象从模拟映射器返回涉及到的对象的模拟映射器假装映射)。
手动配置AutoMapper只需要映射,我想我将需要每个测试(很多工作和手段,我没有测试将真正使用的映射)。
在单元测试中使用基础结构代码有什么意见? 它在什么时候成为集成测试(即测试AutoMapper和我的控制器的集成)?
感觉像2是纯粹主义的观点,尽管我认为我需要更多地了解Moq以及如何让它返回与传递到它嘲笑的方法中的实际值相关的值。
我可以倾向于同意#2。 你知道automapper的作品,你知道你的注射工作(得到测试的权利?:-))我会更专注于具体事情,不只是SomeClass.Property = AnotherClass.Property - 这些特殊情况应该测试不基本的复制功能。 不要测试框架的东西。
至于更多的测试代码 - 我觉得完全没问题。 对于给定的单位,测试应该在给定的测试中设置(也在合理的范围内)。
关于Moq,语法很简单,不要过度使用它。 var obj = new Mock(); 然后设置你的属性,如obj.Setup(x => x.Property).returns(“你好”),除非你有一个更具体的问题? Moq也设置了它的所有属性,所以你可能甚至不需要automapper
-edit-发现它,它是obj.SetupAllProperties();
我赞成#2像杰瑞
添加到Moq中,如果您需要根据传递给它的值返回一个对象,则可以这样编写您的设置:
mockObject.Setup(x => x.MapObject(It.IsAny()) .Returns((ProductDto productDto) => { var product = new Product() { Id = productDto.Id, Name = productDto.Name }; return product });
有点杂乱但方便。
链接地址: http://www.djcxy.com/p/74395.html