Unit testing 单元测试AngularJS服务
我正试图找出如何测试依赖于Unit testing 单元测试AngularJS服务,unit-testing,angularjs,Unit Testing,Angularjs,我正试图找出如何测试依赖于$http的AngularJS服务 当使用$httpBackend模拟AJAX帖子时(whenPOST),您发布的对象是否确定响应 以下是我的服务和测试示例: (function () { "use strict" var app = angular.module('cs'); app.service('PlateCheckService', ['$http', function ($http) { return {
$http
的AngularJS服务
当使用$httpBackend
模拟AJAX帖子时(whenPOST
),您发布的对象是否确定响应
以下是我的服务和测试示例:
(function () {
"use strict"
var app = angular.module('cs');
app.service('PlateCheckService', ['$http', function ($http) {
return {
checkPlate: function (plateNumber) {
return $http.post('PlateCheck/Index', {
plateNumber: plateNumber
}).then(function (response) {
return {
message: response.data.VehicleAtl === null ? 'Clean' : 'Hot',
alertClass: response.data.VehicleAtl === null ? 'alert-success' : 'alert-danger'
}
});
}
}
}]);
}());
测试
/// <reference path="../libs/angular-1.0.8/angular.js" />
/// <reference path="../libs/angular-1.0.8/angular-mocks.js" />
/// <reference path="../libs/jasmine-1.3.0/jasmine.js" />
/// <reference path="../app.js" />
/// <reference path="../services/plate-check-service.js" />
describe('Plate Check Service', function () {
var httpBackend,
service;
beforeEach(function () {
module('cs');
inject(function ($httpBackend, PlateCheckService) {
httpBackend = $httpBackend;
httpBackend.whenPOST('PlateCheck/Index', { plateNumber: '123456' }).respond({
response: {
message: 'Clean',
alertClass: 'alert-success'
}
});
httpBackend.whenPOST('PlateCheck/Index', { plateNumber: '123456789' }).respond({
response: {
message: 'Hot',
alertClass: 'alert-danger'
}
});
service = PlateCheckService;
});
});
it('Should return a clean plate.', function () {
var result;
service.checkPlate('123456').then(function (response) {
result = response;
});
httpBackend.flush();
expect(result.message).toBe('Clean');
expect(result.alertClass).toBe('alert-success');
});
});
Test 'Plate Check Service:Should return a clean plate.' failed
Expected 'Hot' to be 'Clean'.
Expected 'alert-danger' to be 'alert-success'.
in D:\Code\Scripts\angular\specs\plate-check-service-specs.js (line 35)
0 passed, 1 failed, 1 total (chutzpah).
========== Total Tests: 0 passed, 1 failed, 1 total ==========
它似乎没有考虑我传递给将其发布到服务器的服务的plateNumber
我本以为这次考试会通过的
这有什么意义吗?您使用的是
when
而不是expect
$httpBackend
可以在两种不同的模式下运行。发件人:
有两种方法可以指定应该返回什么样的测试数据
当被测代码生成http时,模拟后端的http响应
要求:
- $httpBackend.expect-指定请求期望值
- $httpBackend.when-指定后端定义
expectPOST
,则模拟将考虑该请求
希望这能有所帮助。是否应该将
expect
放在it
中,或者像when
一样放在每个之前的中?另外,您什么时候会使用一个而不是另一个?当您想要使用响应时,请使用expect
。根据共享设置的测试数量,您可以在每次设置之前将设置放入或it
。但是,最好在测试附近本地化设置(尽可能多)。文档中说“后端定义…如果发出请求,只返回经过培训的响应”,所以我不明白为什么后端定义在这种情况下不起作用?