3

私はこれで何時間も立ち往生しています。それは、Jasmine と Angularjs が初めてだからです。基本的に、私はこのコントローラーを持っています。

angular.module('toadlane.controllers', []).
    controller('MainController', function($scope, $http, SomeService) {

        var promise = SomeService.getObjects();

        promise.then(function(data) {
            if(data.length > 0) {
                $scope.objs = data;
            } else {
                $scope.message = "Please come back soon";
            }
        });
    });

SomeService をモックしてスタブアウトし、長さが 0 であってはならないdataデータがあるかどうかをシミュレートする Jasmine テストを作成するにはどうすればよいですか。scopedata

'use strict';

describe('controllers', function () {
    var scope, someService;
    beforeEach(module('services'));
    beforeEach(module('controllers'));
    beforeEach(inject(function (SomeService) {
        someService = SomeService;

        var callback = jasmine.createSpy();
        someService.getObjs().then(callback);
    }));

    it('should return some objs', inject(function ($rootScope, $controller) {
        scope = $rootScope.$new();

        expect($controller('MainController', {$scope: scope, SomeService : someService})).toBeTruthy();

        expect(scope.objs.length).toEqual(2);
    }));

    it('should return no objs', inject(function ($rootScope, $controller) {
        scope = $rootScope.$new();

        expect($controller('MainController', {$scope: scope, SomeService : someService})).toBeTruthy();


        expect(scope.message).toEqual("Please come back soon");
    }));

});

thenからスタブする方法がわからないため、テストは終了していませんpromise

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

7

defer は、チェーンされたメソッドでオブジェクトを返す関数で promise をモックすることによってテストできます。この場合、mockedSomeService.getObjsは method を持つオブジェクトを返す必要がありますthen

これを行うには、別の 1 つのbeforeEachステートメントを追加します。

beforeEach(module(function ($provide) {
  $provide.value('SomeService', {
    getObjs: function () {
      return {
        then: function (callback) {
          // mockedResponseData is passed to callback
          callback(mockedResponseData);
        }
      };
    }
  }));

モックされたサービスは、既存の promise コールバック関数にすぐに結果をロードします。

于 2013-04-27T22:03:12.097 に答える