私は 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 機能もインターセプトできるという考えを得たいだけです。