将本地 JSON 加载到 Jasmine/Karma AngularJS 中的单元测试
Load local JSON into Jasmine/Karma Unit Test in AngularJS
我正在测试接受响应对象作为唯一参数的回调函数。此对象是对其他地方发出的 HTTP 请求的响应,因此我不想在此测试中使用 $httpBackend,因为该请求与此功能无关。
它在 home.js 中,它是我应用主页的控制器。
这里是正在测试的函数:
function submitLogin() {
LoginService.login(loginPost, ctrl.username, ctrl.password, successCallback, errorCallback);
}
// gets called in LoginService if login reponse is 201, otherwise errorCallback called
function successCallback(response) {
// get details needed to determine correct forms for user
var sessionData = {
token: response.data.token,
user_id: response.data.user_id,
institution_name: response.data.institution_name,
status: response.data.status,
form_uri: getFormURI(response.data.forms) //extracts form URI for list of available forms for particular app
};
ctrl.formCheckInProgress = true;
// update users forms from backend and cache them
FormFetcherService.updateCachedForms(sessionData.user_id, sessionData.form_uri).then(function (response) {
if (response == 'updated') {
toastr.success('Your forms have been updated to the newest version', 'Forms Updated');
}
else {
toastr.success('Your forms are already up-to-date', 'No Update Required');
}
});
}
登录服务:
angular.module('appName').service('LoginService', ['$http', function ($http) {
this.login = function (url, username, password, successCallback, errorCallback) {
var data = {
username: username,
password: password
};
$http.post(url, $.param(data), {
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
timeout: 10000
}
).then(successCallback, errorCallback);
}
}]);
我想加载一个对象来代替传递给函数的 'response' 对象。
有什么方法可以将 .json 文件放入我的 /tests 目录,加载 JSON 并将其解析为 Javascript 对象,然后在中使用该对象我的单元测试?
我四处搜索,大多数解决方案都假设正在测试的函数中发出请求 - 但这里不是这种情况。
干杯,
院长
你可以这样做:
var LoginService, $controller;
var formFetcherService = {
updateCachedForms: jasmine.createSpy('sessionData');
}
var response = {
data: {
user_id: 4,
forms: 'some'
}
}
beforeEach(module(function($provide) {
$provide.value('LoginService', {
login: function(url, username, password, successCallback, errorCallback) {
successCallback(response);
}
});
$provide.value('FormFetcherService', formFetcherService);
}))
beforeEach(inject(function(_$controller_) {
$controller = _$controller_;
});
it('should create sessionData', function() {
var controller = $controller('HomeController');
controller.submitLogin();
expect(formFetcherService.updateCachedForms).toHaveBeenCalledWith(response.user_id, response.form_uri);
});
@dean-sherwin 虽然这实际上可能无法回答问题,但我想分享一段我一直用来从文件中加载 json 以进行茉莉花测试的代码,因为:
- 您并不总是想在一个测试规范中保留大量 json 数据
- 如果需要
,有助于跨多个规格共享 json 数据
spyOn(SomeClass, 'someMethod').and.returnValue(
$.ajax({
url: "somefolder/anotherfolder/theJSONFile.json",
async: false,
dataType: "json"
}).then(function(data) {
return data
})
);
我正在测试接受响应对象作为唯一参数的回调函数。此对象是对其他地方发出的 HTTP 请求的响应,因此我不想在此测试中使用 $httpBackend,因为该请求与此功能无关。
它在 home.js 中,它是我应用主页的控制器。
这里是正在测试的函数:
function submitLogin() {
LoginService.login(loginPost, ctrl.username, ctrl.password, successCallback, errorCallback);
}
// gets called in LoginService if login reponse is 201, otherwise errorCallback called
function successCallback(response) {
// get details needed to determine correct forms for user
var sessionData = {
token: response.data.token,
user_id: response.data.user_id,
institution_name: response.data.institution_name,
status: response.data.status,
form_uri: getFormURI(response.data.forms) //extracts form URI for list of available forms for particular app
};
ctrl.formCheckInProgress = true;
// update users forms from backend and cache them
FormFetcherService.updateCachedForms(sessionData.user_id, sessionData.form_uri).then(function (response) {
if (response == 'updated') {
toastr.success('Your forms have been updated to the newest version', 'Forms Updated');
}
else {
toastr.success('Your forms are already up-to-date', 'No Update Required');
}
});
}
登录服务:
angular.module('appName').service('LoginService', ['$http', function ($http) {
this.login = function (url, username, password, successCallback, errorCallback) {
var data = {
username: username,
password: password
};
$http.post(url, $.param(data), {
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
},
timeout: 10000
}
).then(successCallback, errorCallback);
}
}]);
我想加载一个对象来代替传递给函数的 'response' 对象。
有什么方法可以将 .json 文件放入我的 /tests 目录,加载 JSON 并将其解析为 Javascript 对象,然后在中使用该对象我的单元测试?
我四处搜索,大多数解决方案都假设正在测试的函数中发出请求 - 但这里不是这种情况。
干杯,
院长
你可以这样做:
var LoginService, $controller;
var formFetcherService = {
updateCachedForms: jasmine.createSpy('sessionData');
}
var response = {
data: {
user_id: 4,
forms: 'some'
}
}
beforeEach(module(function($provide) {
$provide.value('LoginService', {
login: function(url, username, password, successCallback, errorCallback) {
successCallback(response);
}
});
$provide.value('FormFetcherService', formFetcherService);
}))
beforeEach(inject(function(_$controller_) {
$controller = _$controller_;
});
it('should create sessionData', function() {
var controller = $controller('HomeController');
controller.submitLogin();
expect(formFetcherService.updateCachedForms).toHaveBeenCalledWith(response.user_id, response.form_uri);
});
@dean-sherwin 虽然这实际上可能无法回答问题,但我想分享一段我一直用来从文件中加载 json 以进行茉莉花测试的代码,因为:
- 您并不总是想在一个测试规范中保留大量 json 数据
- 如果需要 ,有助于跨多个规格共享 json 数据
spyOn(SomeClass, 'someMethod').and.returnValue(
$.ajax({
url: "somefolder/anotherfolder/theJSONFile.json",
async: false,
dataType: "json"
}).then(function(data) {
return data
})
);