gpt4 book ai didi

javascript - 在没有业力的情况下运行 Jasmine Angular Testing

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:18:01 35 4
gpt4 key购买 nike

我有一个可以正常工作的 Angular 应用程序,我需要为其编写单元测试(我知道通常情况恰恰相反)。

每当我运行 jasmine 任务时,我都会收到以下错误:

ReferenceError: Can't find variable: ApplicationService

我们只想在没有业力的情况下在 phantomJS 中运行测试这是否可能,如果可以,你能看看我的代码并告诉我发生了什么问题吗?

我在我的 gruntfile 中添加了一个 jasmine 任务,如下所示:

jasmine:{
src: ['src/main/js/**/*.js'],
options:{
specs: 'src/test/js/**/*.js',
vendor: [ 'src/test/lib/**/*.js', 'src/main/lib/js/*.js']
}
},

我要测试的服务位于文件“src/main/js/services/ApplicationService.js”中,如下所示:

(function(){

'use strict';

var services = angular.module('portal.services');

services.factory('ApplicationService', ['ApplicationData', 'localStorageService' ,'UserService', function(ApplicationData, localStorageService, UserService){
return new ApplicationService(ApplicationData, localStorageService, UserService);
}]);

function ApplicationService(ApplicationData, localStorageService, UserService){
this.applicationData = ApplicationData;
this.localStorageService = localStorageService;
this.userService = UserService;
}

ApplicationService.prototype.getApplications = function(entity){
var locale = this.userService.getUserinfoLocale();
var applications = this.localStorageService.get(Constants.key_applications+locale+'_'+entity);
if(applications !== null && applications !== undefined){
return JSON.parse(applications);
} else {
return this.applicationData.getApplications().query({locale: locale, entity: entity}, $.proxy(function(data){
this.save(Constants.key_applications+locale+'_'+entity, JSON.stringify(data));
}, this));
}
};

}());

我的测试文件位于“src/test/js/services/ApplicationServiceTest.js”中,如下所示:

(function () {

'use strict';

describe('ApplicationService.js unit test suite', function () {

var applicationData, localStorageService, userService = null;
var applicationService = new ApplicationService(applicationData, localStorageService, userService);

beforeEach(function () {
applicationData = {
getApplications:function () {
return {application1:'yess', application2:'okay'};
}
};
localStorageService = {
get:function (key) {
if (key === Constants.key_applications + 'nl_ESS')
return JSON.stringify({application1:'name1'});
else if (key === Constants.key_applications + 'nl_SVF')
return JSON.stringify({application1:'name2'});
else if (key === Constants.key_applications + 'nl_MED')
return JSON.stringify({application1:'name3'});
},
add:function (key, value) {

}
};
userService = {
getUserinfoLocale:function () {
return 'nl';
}
};
});


it('ApplicationService.getApplications should delegate to ApplicationData.getApplications', function () {
var applicationService =
spyOn(localStorageService, get(Constants.key_applications + 'nl_ESS')).andReturn(null);
spyOn(applicationData, 'getApplications');
expect(applicationService.getApplications()).toBe({application1:'name1', application2:'name2'});
expect(applicationData.getApplications).toHaveBeenCalled();
});

it('ApplicationService.getApplications should use the localsStorageService cache', function () {

});

});
}());

最佳答案

我知道这是一个非常古老的问题,但以防万一它仍然有效或其他人有同样的问题:您没有将 ApplicationService.js 中的任何 ApplicationService 暴露给外界,因为您放置了一个(函数() {...})() 围绕它,因此无法在您的测试中实例化它。

如果你想用 agular 的方式测试它,你应该使用 angular-mocks 尤其是 module()inject()它提供的功能。这将允许您将该服务注入(inject)到您的测试中。

如果您想以“POJO”方式测试它,您应该以某种方式公开 ApplicationService。删除函数包装器是最简单的方法,但这会破坏您所做的仅将其作为服务公开的良好隔离。因此,我的建议是使用 Angular 模拟。

关于javascript - 在没有业力的情况下运行 Jasmine Angular Testing ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20658342/

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