Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 单元测试AngularJS服务_Unit Testing_Angularjs - Fatal编程技术网

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
。但是,最好在测试附近本地化设置(尽可能多)。文档中说“后端定义…如果发出请求,只返回经过培训的响应”,所以我不明白为什么后端定义在这种情况下不起作用?