如何在jasmin-karma单元测试中为LocalForage.getItem()方法创建一个模拟?

时间:2015-11-23 03:00:51

标签: angularjs unit-testing karma-jasmine localforage

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

1 个答案:

答案 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'))