我在有效测试进行Web服务调用的AS3类时遇到了概念上的困难。请参考以下示例代码:
class ServiceWrapper extends EventDispatcher
public function doStuff():void {
var loader:URLLoader = new URLLoader;
var request:URLRequest = new URLRequest();
request.url = 'http://myapiendpoint.com/foo';
var self:ServiceWrapper = this;
loader.addEventListener(Event.COMPLETE, function(event:Event):void {
if(loader.data == 'success') {
this.dispatchEvent('stuffDone');
} else {
this.dispatchEvent('stuffNotDone');
}
});
loader.load(request);
}
end
我只想测试一下,如果服务返回“成功”,则实例会调度stuffDone
事件类型,否则会调度stuffNotDone
。
似乎没有在应用程序代码中暴露“测试接口”的情况下模拟Web服务响应。例如,可以想到以下示例:
loader
设为公共属性或从公开返回,并在测试中将其替换为模拟。loader
或生成它的函数受到保护,并定义一个扩展ServiceWrapper
的私有类,以提供对loader
的运行时访问或持久模拟。第一个选项以非常难看的方式修改界面。它可以通过文档解决(或者可能通过命名空间解决;不太确定如何去做),如果这是唯一的选择,我很好,但我觉得应该有更好的方法。
第二个稍微好一些,保留了我认为的界面,但在测试中需要大量额外的代码。
对于我忽视的问题,是否有一些解决方案或观点?在此先感谢您的帮助。
答案 0 :(得分:1)
你的第一个选择应该是要走的路:嘲笑装载机。
始终建议不要在可重用类中包含对象创建代码,除非创建的实例严格保密,并且只与创建它们的类进行交互 - 使用外部服务时绝不会这样。相反,将加载器作为构造函数参数传递 - 这样,您可以确定在调用它时已创建它。
对象创建应该在主分区内发生,如果不是通过依赖注入框架,即系统中必须为每个新应用程序重写的部分。
无需其他文档:您需要的所有文档都在单元测试中。