65

2 つのステートフル サービスとshopに依存するサービスがあるとします。単体テスト用にとの異なるバージョンを挿入するにはどうすればよいですか?schedulewarehouseschedulewarehoseshop

これが私のサービスです:

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

ここに私のモックがあります:

var mockSchedule = {
    isShopOpen : function() {return true}
}
var mockWarehouse = {
    numAvailableSweets: function(){return 10};
}

ここに私のテストがあります:

expect(shop.canSellSweets(5)).toBe(true);
expect(shop.canSellSweets(20)).toBe(false);
4

8 に答える 8

53
beforeEach(function () {
  module(function ($provide) {
    $provide.value('schedule', mockSchedule);
  });
});

Module は angular-mocks モジュールによって提供される関数です。文字列引数を渡すと、対応する名前のモジュールがロードされ、すべてのプロバイダー、コントローラー、サービスなどが仕様で利用可能になります。通常、これらは inject 関数を使用してロードされます。コールバック関数を渡すと、Angular の $injector サービスを使用して呼び出されます。次に、このサービスは、コールバック関数に渡された引数を見て、どの依存関係をコールバックに渡す必要があるかを推測しようとします。

于 2013-10-09T14:38:21.437 に答える
37

Atilla の回答を改善し、KevSheedy のコメントに対する直接の回答を改善するにmodule('myApplicationModule')は、次のようにします。

beforeEach(module('myApplicationModule', function ($provide) {
  $provide.value('schedule', mockSchedule);
}));
于 2014-02-27T13:04:10.623 に答える
7

CoffeeScript を使用すると、いくつかの問題が発生するため、最後にnullを使用します。

beforeEach ->
  module ($provide) ->
    $provide.value 'someService',
      mockyStuff:
        value : 'AWESOME'
    null
于 2014-02-03T17:15:53.883 に答える
6

詳細については、こちらをご覧ください

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

$provide サービスを利用したい。あなたの場合

$provide.value('schedule', mockSchedule);
于 2013-10-09T14:37:13.720 に答える