0

模拟 localForage.getItem 方法的最佳方法是什么?我只需要在调用 localForage.getItem 时简单地返回一个示例对象。

4

1 回答 1

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;
}]);

现在的想法是在您的测试中用模拟替换正常的实现。有几种方法可以做到:

  • 全局:在运行测试之前创建一个模拟模块,它将为所有测试定义模拟实现,您将调用(beforeEach(module('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')),这个简单的就可以了

于 2015-11-23T03:38:16.583 回答