模拟localForage.getItem方法的最佳方法是什么?我只需要在调用localForage.getItem时返回一个示例对象。
答案 0 :(得分:2)
第一件事是将第三方库包装在一个可注射服务中,这样你就可以在测试中交换模拟实现
app.factory('localForage',function(){
//likely coming from global namesapce
return localForage;
});

然后可以在指令,服务,控制器等中注入
//example with controller
myApp.controller('myCtrl',['localForage',function(localForage){
this.getItem = localForage.getItem;
this.setItem = loaclForage.setItem;
}]);

现在的想法是在测试中用mock替换正常的实现。有几种方法可以做到:
:在运行测试之前创建一个模拟模块 将为您的所有人定义模拟实现 测试,您将调用(beforeEach(模块(' myMockModule'))而不是实际的localForage模块
在测试套件基础上:" $ provide"运行测试之前的不同实现:
beforeEach(module('myModule',function($provide){
$provide.factory('localForage', function(){
return MockImpl;
});
});

var ctrl;
beforeEach(inject(function($controller){
ctrl = $controller('myCtrl',{localForage:mockImpl});
}))

现在关于模拟实现,它取决于你想用它做什么(间谍,存根,其他东西),但想法是让它实现与实际服务相同的api
var mockImpl = {
getItem : angular.noop,
setItem : angular.noop
}

这个简单的例子如果你想检查是否调用了localForage以及使用哪些参数(使用spyOn(mockImpl,' getItem'))