Actionscript 3 当单元测试依赖于其他单元时,它们如何可以是模块化的?
我试图对一个相当复杂但使用MVC的应用程序进行回顾性的单元测试。我知道回顾性地应用单元测试并不理想,但我仍然相信重构现有代码是可能的。大多数情况下,如果不依赖于其他单元(即视图依赖于模型),就不可能对一个单元进行单元测试 在这种情况下,单元测试的最佳方式是什么?使用真实模型还是创建模拟模型更好 在我的情况下使用真实模型的问题是,该模型依赖于从XML获取数据的其他响应类,因此存在依赖链。这个模型有很多数据,所以使用它会容易得多,但也许我没有抓住要点 为了简洁起见,我提供了应用程序的UML **编辑**** 如果我是正确的,那么在模拟类中创建模拟数据是最佳实践吗?例如,我有一个模拟类“MockPlayPanelModel”,它创建了视图类“PlayPanel”运行时无错误所需的数据:Actionscript 3 当单元测试依赖于其他单元时,它们如何可以是模块化的?,actionscript-3,apache-flex,unit-testing,mocking,flexunit4,Actionscript 3,Apache Flex,Unit Testing,Mocking,Flexunit4,我试图对一个相当复杂但使用MVC的应用程序进行回顾性的单元测试。我知道回顾性地应用单元测试并不理想,但我仍然相信重构现有代码是可能的。大多数情况下,如果不依赖于其他单元(即视图依赖于模型),就不可能对一个单元进行单元测试 在这种情况下,单元测试的最佳方式是什么?使用真实模型还是创建模拟模型更好 在我的情况下使用真实模型的问题是,该模型依赖于从XML获取数据的其他响应类,因此存在依赖链。这个模型有很多数据,所以使用它会容易得多,但也许我没有抓住要点 为了简洁起见,我提供了应用程序的UML **编
class MockPlaylistPanelModel extends Mock implements IPlaylistPanelModel
{
/**
* Return all playlist items
* @public
*/
public function get mainPlaylistItems():Vector.<PlaylistData>
{
var playData:Vector.<PlaylistData> = new Vector.<PlaylistData>;
var playlistResp:PlaylistData = new PlaylistData(0, "", "", 0, 0, 0, 0);
playData.push(playlistResp);
return playData;
}
}
类MockPlaylistPanelModel扩展了Mock实现IPlaylistPanelModel
{
/**
*返回所有播放列表项目
*@公众
*/
公共函数get mainplaylitems():Vector。
{
var播放数据:矢量。=新矢量。;
var PLAYLESP:PLAYDATA=新的播放数据(0,“,”,0,0,0,0);
playData.push(播放列表);
返回播放数据;
}
}
它们不是单元测试;它们是集成测试
是的,使用mock隔离单元测试的类。单元测试必须只测试程序的一部分。如果您使用其他部分,它将成为集成测试 集成测试检查各部件是否协同工作,而不是执行它们必须执行的操作 单元测试检查部件是否执行了它必须执行的操作 这就是两个测试之间的差异
要为单元测试进行重构,您可以寻找设计模式依赖注入。要将单元测试追溯到现有应用程序中,您通常需要更改应用程序代码以支持单元测试(正如您正确提到的,您可能需要执行一些重构)。然而,这里的风险当然是对应用程序的更改会引入bug,如果没有适当的测试,就无法防止这些bug 因此,一种明智的方法是让一些系统级测试覆盖一些关键用例。这就像是围绕应用程序的一种“测试脚手架”,这意味着您可以更安全地开始引入较低级别的测试,同时在修改应用程序以使其更易于测试时降低引入错误的风险。一旦这一点落实到位,您就可以引入一个策略,即开发人员必须在更改代码之前,围绕他们更改的任何代码编写测试—这允许您围绕应用程序有机地生成一组自动化测试 我强烈建议您掌握—这本优秀的书涵盖了将测试引入到几乎没有自动化测试的现有应用程序中的各种有用技术
关于是否应该在模拟类中创建模拟数据以进行测试的问题,这是注入对象的测试版本时可以采用的一种方法,但可能不是最好的方法。通过使用模拟框架,您可以轻松地创建具有明确定义的动态行为的模拟对象。在您的情况下,您可以使用Mockito创建一个mock模型实现,然后将您的mock模型注入依赖于它的任何对象。+1代表书籍参考,+1代表Mockito,+1代表一个好答案-太糟糕了,我只能投票一次。。。