Единичное тестирование услуги AngularJS

Я пытаюсь выяснить, как проверить мою службу AngularJS, которая имеет зависимость от $http.

При использовании $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 Я передаю службу, которая отправляет ее на сервер.

Я бы ожидал, что этот тест пройдет.

В этом смысл?

Ответ 1

Вы используете when вместо expect. $httpBackend может работать в двух разных режимах. Из документов:

Существует два способа указать, какие данные теста должны быть возвращены как http-ответы от макетного бэкэнда, когда тестируемый код делает http запросы:

  • $httpBackend.expect - указывает на ожидание запроса
  • $httpBackend.when - указывает определение бэкэнд

Запрос ожиданий и определения Backend. Запросы ожиданий предоставляют способ сделать утверждения о запросах, сделанных приложения и определить ответы для этих запросов. Тест будет если ожидаемые запросы не сделаны или они сделаны в неправильный порядок.

Определения бэкэдов позволяют определить фальшивый сервер для вашего приложение, которое не утверждает, если был сделан конкретный запрос или не, он просто возвращает подготовленный ответ, если запрос сделан. Тест будет ли получен запрос во время тестирования.

Если вы измените настройку на использование expectPOST, тогда макет учтет запрос.

Надеюсь, что это поможет.