Bob*_*way 5 wpf resharper refactoring unit-testing mvvm
我继承了一个功能但很混乱的WPF MVVM应用程序.令我烦恼的是,几乎没有任何单元测试使得采用MVVM有点毫无意义.所以我决定添加一些.
在抓住了悬而未决的果实后,我开始陷入困境.有很多高度相互依赖的代码,特别是在Views中使用的属性和方法中.例如,一次呼叫引发一系列"财产变化"事件,这反过来引发其他呼叫等等.
这使得测试非常困难,因为您必须编写大量的模拟并设置大量属性来测试单个函数.当然,每个类只需要执行一次,然后在每次测试中重复使用mock和ViewModel.但它仍然是一种痛苦,这让我觉得这是错误的做事方式.当然,尝试打破代码并使其更加模块化会更好.
我不确定MVVM中有多么现实.而且我处于恶性循环中,因为没有良好的测试,我担心通过重构编写好的测试来打破构建.事实上它是WPF MVVM是另一个问题,因为没有任何东西跟踪View和ViewModel之间的相互依赖性 - 粗心的名称更改可能会完全破坏某些东西.
我正在使用C#VS2013并抓住ReSharper的试用版,看看它是否会有所帮助.使用起来很有趣,但到目前为止还没有.我的单元测试经验并不多.
那么 - 我怎样才能合理,有条不紊地安全地处理这个问题呢?我如何使用现有工具(并查看任何其他工具)来提供帮助?
您的应用程序解决了一些现实问题,这就是业务逻辑所代表的问题.即使它们(组件)尚不存在(作为单独的类),您的视图模型也会围绕这些业务逻辑组件.
因此,您应该假设视图模型是轻量级的,数据准备/重新排列对象.所有繁重的工作都应该在业务逻辑对象中完成.视图模型应与原始数据一起提供,显示就绪.
记住这个重要的假设(VM = no BL)将业务逻辑组件移动到可能的模块化项目中.以模块化方式组织BL通常会导致项目结构类似于:
Company.Project.Feature.Contract- 与功能相关的接口,实体,DTOCompany.Project.Feature- 执行合同Company.Project.Feature.Tests- 测试功能实现#1和#2的目标是达到放弃WPF并用console-interface替换它的状态应该只需要编写控制台接口并用BL层连接它.与WPF相关的所有内容(Views,ViewModels)都可以移位删除,这样的操作不应该破坏一件事.
在需要的地方熟悉依赖注入和抽象.介绍IoC容器.不要让你的代码依赖于实现,使其依赖合同.每当视图模型依赖于BL实现时,将其与BL-abstraction交换.这将是使视图模型可测试的必要步骤之一.
这就是我的开始.这绝不是一个详尽的清单,我相信你会遇到坚持下去的情况是不够的.但这就是它 - 使用遗留代码并不是一件容易的事.