单元测试,依赖注入和AutoMapper注释
我最近刚刚使用MVC在SQL Server数据库上构建CRUD应用程序。 实体框架和提供的脚手架实用程序使这非常容易。 我特别喜欢我如何在模型中使用数据注释来集中数据字段的标签名称,验证等。 我发现MVC是直观的,有组织的,我能够使用实体框架添加自定义功能,如更改跟踪,而无需额外的代码或沮丧。
然后我决定将它提升到一个新的水平,并加入单元测试。 事情很快变得更加复杂。
我读到用实际数据库进行的单元测试存在问题并且速度慢,通常不推荐。 最好交换模拟数据库调用或使用内存数据库替换。 说得通。 所以,我做的第一件事是编写一个独立的存储库层来隔离数据库调用。 我很快发现,这本身是不够的。 为了在测试时轻松替换另一个版本库而无需重新编写代码,需要通过构造函数使用依赖注入控制模式的反转将正确的版本库实现注入到控制器中。 由于依赖注入依赖于接口,因此我必须为所有存储库类添加接口定义,安装Ninject来管理注入并且连线注入正确的接口实现。 我还实现了一个工作单元接口来封装更新可能多个存储库并提交所有更改的过程。
然后我发现,在我的CRUD应用程序中编辑现有记录时,内置的字段映射器不能回发用依赖注入构建的编辑对象。 接下来,我介绍了每个视图的单独,简化视图模型的原理,这些视图只定义了视图所需的精确字段信息,并使用AutoMapper将数据模型映射到每个视图模型,并在发布后再次返回。 所以,经过更多的学习,安装和接线后,我得到了这个工作。 不幸的是,我发现虽然AutoMapper映射项目之间的字段值,但它不映射数据注释。 这意味着我必须复制数据模型和4或5视图模型之间的所有数据注释,以便标签,字段验证等工作。 我发现了一些建议来解决这个问题,但他们似乎并不简单或强大。 我知道这不应该是一个炫耀者,但这是我遇到的第一个严重障碍,我无法找到合理的解决方案,并且它在扰乱我。
我的问题:
有没有人有经过验证的方法让AutoMapper也映射数据注释? 是否有另一种类似的工具可以解决这个问题?
上述所有的工作都是从一个简单的愿望来做一些替代数据库的单元测试。 我的项目的代码大小和复杂性从原始MVC项目和使用脚手架自动创建的类显着增加。 我知道共识是,这是组织测试和未来开发和重构项目的“正确”方式,但这是否真的值得? 如果我的测试只使用真实数据库的副本,我可以有一个更简单的项目。 我很想听听别人的经验和观点。
AFAIK,您引用的数据注释(如[Display]
)用于表示层。 将它们放入数据库模型是没有意义的。 如果将它们放入正确的图层,则不必重复它们。
还有一些属于数据层的属性(例如字段长度和表连接)不属于表示层。 基本上,你只需要根据功能保持它们分开。
我最终只实现了一个存储库,将实际的数据库调用与控制器分开。 这让我可以独立测试存储库功能,并确保我获得了我期望的数据。
我决定在这种情况下,依赖注入,字段映射和字段注释重复的所有额外复杂性和开销超过了测试的好处。 特别是对于CRUD应用程序,其中98%的功能是数据库访问或数据显示。 没有一个没有业务逻辑的测试。
链接地址: http://www.djcxy.com/p/74403.html上一篇: Unit testing, dependency injection and AutoMapper annotations