gpt4 book ai didi

javascript - Jasmine spyOn 在 AngularJS 指令上无法正常工作

转载 作者:行者123 更新时间:2023-11-30 20:37:36 24 4
gpt4 key购买 nike

我正在开发 AngularJS 应用程序,但在具体指令中遇到了 Jasmine 的 SpyOn 的一些问题。

该指令非常简单,只需调用一个服务的方法,当它解决/拒绝 promise 结果时,设置一些值或其他值。

问题:当我尝试模拟 SignatureService.getSignatureData 时SpyOn 没有像我预期的那样工作,就像我在调用 jasmine 的 callThrough 一样。方法结束 getSignatureData .

我一直在其他指令和服务中使用 spyOn 和模拟,这些都没有问题。

这两天我一直在尝试解决这个问题,与其他解决方案和用户的答案进行比较,但我找不到有效的解决方案。

这是我的代码:

AngularJS 指令代码:

angular
.module('module_name')
.directive('signatureDirective', signatureDirective);

angular
.module('GenomcareApp_signature')
.controller('signatureDController', signatureDController);

function signatureDirective() {
return {
restrict: 'E',
templateUrl: 'components/signature/signature.directive.html',
controller: signatureDController,
controllerAs: 'ctrl',
bindToController: true
};
}

signatureDController.$inject = [
'$scope',
'$rootScope',
'$location',
'SignatureService'
];

function signatureDController($scope, $rootScope, $location, SignatureService) {
var controller = this;

$scope.$on('pdfFileLoadSuccessfully', function (data) {
console.log(data);
controller.loadPdfSucceed = true;
});

$scope.$on('pdfFileLoadFails', function (data) {
console.error(data);
controller.loadPdfError = true;
});

function loadDirectiveInitData() {
var queryParameters = atob($location.search().data);
controller.email = queryParameters.split(';')[0];
controller.phone = queryParameters.split(';')[1];
controller.docid = queryParameters.split(';')[2];

SignatureService.getSignatureData(controller.email, controller.phone, controller.docid)
.then(
function (data) {
console.log(data);
controller.stampTime = data.stamp_time;
controller.fileUrl = data.original_file.url;
},
function (error) {
console.error(error);
controller.error = true
})
.finally(
function () {
controller.endLoad = true;
})
}

loadDirectiveInitData();
}

Jasmine 测试代码:

'use strict';
/* global loadJSONFixtures */


describe('Test :: Signature directive', function () {
beforeEach(angular.mock.module('app'));
beforeEach(module('translateNoop'));

var $q, $compile, $rootScope, controller, $scope, $httpBackend, $location, SignatureService;

beforeEach(angular.mock.inject(function (_$controller_, _$q_, _$rootScope_, _$location_, _$compile_, _$httpBackend_, _SignatureService_) {
$q = _$q_;
$compile = _$compile_;
$location = _$location_;
$scope = _$rootScope_.$new();
$httpBackend = _$httpBackend_;
SignatureService = _SignatureService_;

spyOn($location, 'search').and.returnValue({data: 'dGVzdEB0ZXN0LmNvbTsrMzQ2NjY2NjY2NjY7WG9TUFFnSkltTWF2'});
$httpBackend.whenGET('components/signature/signature.directive.html').respond(200, '');

controller = _$controller_('signatureDController', {$scope: $scope});
}));

describe('Testing directive', function () {
it('Init data should be set when promise resolves/rejects', function (done) {
// SpyOn DOES NOT MOCK THE SERVICE METHOD
spyOn(SignatureService, 'getSignatureData').and.callFake(function () {
return $q.resolve({...})
});

var element = angular.element('<signature-directive></signature-directive>');
element = $compile(element)($scope);
$scope.$digest();
done();

// ... some expect stuff
});
});
});

如果有人能给我一些建议或解决方案,我将不胜感激。

非常感谢。

UPDATE1:我不知道为什么,但如果我不声明 controller全局变量 beforeEach ,Jasmine 的 spyOn 如我所料模拟了该方法。

现在的问题是如何让 Controller 测试 Controller 值是否按预期设置。

最佳答案

嗯...我意识到问题在于 Controller 是在创建之前创建的,并且不知何故当服务被模拟时 Controller 忽略了它。当我将服务的 spyOn 粘贴到全局 beforeEach 时,这个想法是偶然产生的。

所以我决定创建一个新的 Controller 实例和相应的 spyOn,并在每个 describebeforeEach 中获得所需的结果。

它有效。也许这不是最好的方法,我鼓励任何有答案的人发布它。我将永远心存感激。

这是我的最终测试代码:

describe('Test :: Signature directive', function () {
beforeEach(angular.mock.module('app'));
beforeEach(module('translateNoop'));

var $q, $compile, $rootScope, $scope, $httpBackend, $location, SignatureService, test_fixture;

beforeEach(angular.mock.inject(function (_$q_, _$rootScope_, _$location_, _$compile_, _$httpBackend_, _SignatureService_) {
$q = _$q_;
$compile = _$compile_;
$location = _$location_;
$scope = _$rootScope_.$new();
$httpBackend = _$httpBackend_;
SignatureService = _SignatureService_;
// controller = _$controller_;

spyOn($location, 'search').and.returnValue({data: 'dGVzdEB0ZXN0LmNvbTsrMzQ2NjY2NjY2NjY7WG9TUFFnSkltTWF2'});
$httpBackend.whenGET('components/signature/signature.directive.html').respond(200, '');
}));

describe('Testing directive when service resolve promise', function () {
var controller;
beforeEach(inject(function(_$controller_) {
spyOn(SignatureService, 'getSignatureData').and.callFake(function () {
return $q.resolve({...})
});

controller = _$controller_('signatureDController', {$scope: $scope})
}));

it('Init data should be set', function () {
// spyOn($location, 'search').and.callThrough();
var element = angular.element('<signature-directive></signature-directive>');
element = $compile(element)($scope);
$scope.$digest();

// ... some expect(...).toEqual(...) stuff and more

});
});
});

感谢您的宝贵时间。

关于javascript - Jasmine spyOn 在 AngularJS 指令上无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49646330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com