4

私は Angular と Jasmine を初めて使用し、サービスの「クエリ」呼び出しを偽造しようとすると問題が発生します。以下は「記述」で囲まれています。

var mockBackend;

beforeEach(inject(function($rootScope, $controller, AppServ) {
  // We need to setup our controllers to use fake services provided by angular-mocks
  $scope = $rootScope.$new();
  mockBackend = AppServ;

  $controller('AppInformationController', {
    $scope: $scope,
    AppServ: mockBackend
  });
}));

it("should try to call the service, but we intercept it", function() {
  spyOn(mockBackend, 'query').andReturn({'title':'Mock title'});

  $scope.serverAppNameChange();
  expect($scope.app.title).toBe("Mock title");
});

上記の「AppServ」は私のサービスであり、テストがそのサービスで「クエリ」を呼び出してデフォルト情報を返すたびにインターセプトしたいと思います。本当にこれは、Jasmine と Angular がどのように機能するかを理解するためのものです。サービス自体は、ローカル コピーを保持するだけです (基本的に偽のサービスです)。

サービスは次のとおりです。

Services.factory("AppServ", function($http) {
  var app = {};
  var theAppOnServer = {};

  app['query'] = function() {
    return theAppOnServer;
  };

  app['save'] = function(app) {
    theAppOnServer = $.extend({}, app);
  };

  app['updateApp'] = function() {
    theAppOnServer['title'] = "Title From Server";
  };

  return app;
});

コントローラーは次のとおりです。

MobileIntake.controller("AppInformationController", function($scope, AppServ) {
  $scope.app = AppServ.query();

  //var AppOverviewController = function($scope) {
  $scope.appNameChange = function(oldValue, newValue, scope) {
    console.log("You've changed the app name!");
  };

  $scope.serverAppNameChange = function() {
    AppServ.updateApp();
  };
  // Set up a watcher if we want to be updated by other things (like the server)
  $scope.$watch("app.title", $scope.appNameChange);

});

spyOnがサービスの「クエリ」関数呼び出しを傍受していないように見える理由について、誰かが私に手がかりを与えることができますか? 他のいくつかの回答を見てきましたが、それらは $http とそれにいくつかの特別なロジックを使用していますが、非 http 機能もインターセプトできるという考えを得たいだけです。

4

1 に答える 1

4

mockBackend余分なオブジェクトは必要ありません。サービス自体をスパイするだけです。

beforeEach(inject(function($rootScope, $controller) {
  // We need to setup our controllers to use fake services provided by angular-mocks
  $scope = $rootScope.$new();

  $controller('AppInformationController', {
    $scope: $scope
  });
}));

it("should try to call the service, but we intercept it", inject(function(AppServ) {
  spyOn(AppServ, 'query').andReturn({'title':'Mock title'});

  $scope.serverAppNameChange();
  expect($scope.app.title).toBe("Mock title");
}));
于 2013-04-23T20:43:17.373 に答える