在使用jasmine进行单元测试时,如何在AngularJS中模拟服务?

Kev*_*edy 65 unit-testing jasmine angularjs

比方说,我有一个服务shop依赖于两个状态的服务schedulewarehouse.如何注入不同的版本schedule,并warehoseshop单元测试?

这是我的服务:

angular.module('myModule').service('shop', function(schedule, warehouse) {
    return {
        canSellSweets : function(numRequiredSweets){
             return schedule.isShopOpen()
                 && (warehouse.numAvailableSweets() > numRequiredSweets);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

这是我的嘲笑:

var mockSchedule = {
    isShopOpen : function() {return true}
}
var mockWarehouse = {
    numAvailableSweets: function(){return 10};
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试:

expect(shop.canSellSweets(5)).toBe(true);
expect(shop.canSellSweets(20)).toBe(false);
Run Code Online (Sandbox Code Playgroud)

小智 53

beforeEach(function () {
  module(function ($provide) {
    $provide.value('schedule', mockSchedule);
  });
});
Run Code Online (Sandbox Code Playgroud)

模块是角度模拟模块提供的功能.如果传入字符串参数,则会加载具有相应名称的模块,并且所有提供程序,控制器,服务等都可用于规范.通常使用注入功能加载它们.如果传入回调函数,将使用Angular的$ injector服务调用它.然后,该服务查看传递给回调函数的参数,并尝试推断应将哪些依赖项传递给回调.


Mat*_*rds 37

改进Atilla的答案并直接回答KevSheedy的评论,在module('myApplicationModule')你的背景下你会做到以下几点:

beforeEach(module('myApplicationModule', function ($provide) {
  $provide.value('schedule', mockSchedule);
}));
Run Code Online (Sandbox Code Playgroud)

  • 所以这个语法是基本模拟`myApplicationModule`中的`schedule`(或任何服务,控制器,工厂)的语法? (2认同)

Alg*_*kas 7

使用CoffeeScript我在一些问题上运行所以我最后使用null:

beforeEach ->
  module ($provide) ->
    $provide.value 'someService',
      mockyStuff:
        value : 'AWESOME'
    null
Run Code Online (Sandbox Code Playgroud)

  • 为了避免cooffeescript隐式返回,你可以简单地在函数的末尾添加一个`return`语句,因此函数不会返回任何东西而不返回`null`.请参阅/sf/ask/1082870631/ (7认同)

Ada*_*dam 6

你可以在这里查看更多信息

https://docs.angularjs.org/guide/services#unit-testing

您想使用$ offer服务.在你的情况下

$provide.value('schedule', mockSchedule);
Run Code Online (Sandbox Code Playgroud)