Жасмин unit test AngularJS factory с двумя зависимостями ($ http и другой factory возвращающим обещанием)

Я использую Ionic framework для пользовательских приложений. В этом процессе я пытаюсь написать Unit test для factory datastoreServices, который имеет зависимость от DomainService и $http. Я доволен тем, что тестировал тесты Jasmine Unit.

Мои заводы следующие.

app.factory("datastoreServices", ["$http", function($http) {
    return {
        getData: function(data, DomainService) {
            return $http.post(DomainService.host + 'factor', data);
        }
    };
}]);

app.factory('DomainService', function() { //here
    if (ionic.Platform.isAndroid()) {
        return {
            host: 'http://10.0.2.2:7001/'
        }
    }
    return {
        host: 'http://localhost:7001/'
    }
})

И мой скелет Unit test выглядит следующим образом. Он имеет две зависимости, поэтому не мог понять, как действовать. Это то, что я получил до сих пор в файле Unit test.

describe(
        'datastoreServices',
        function() {
            beforeEach(module('Myapp'));
            describe('getData'),
                function() {
                    it("Should return correct values", inject(function(datastoreServices, DomainService, $httpBackend) {
                            expect(datastoreServices.getData(httpBackend.. /***something here!**/ )
                                .toEqual("2.2");
                            }))
                    }

У меня очень мало знаний о насмешливости и материалах. Может кто-нибудь помочь мне проверить, что factory datastoreServices. Следующие вещи должны быть протестированы:

  • Является ли сообщение Http правильными вызовами?
  • Возвращает ли функция правильное обещание?

Вот аналогичный сценарий приложения в plnkr.

Idk, если я слишком много спрашиваю. Заранее спасибо.

Ответ 1

Ключевыми принципами являются:

  • $http издевается во время тестирования, что означает, что ваш сервер фактически не вызывается во время выполнения вашего теста.
  • вы должны использовать $httpBackend, чтобы утверждать HTTP-вызовы и отклик от ответа сервера https://docs.angularjs.org/api/ngMock/service/ $httpBackend
  • вы можете легко вводить или издеваться над любыми зависимостями, необходимыми для вашего теста.

Вот пример, основанный на вашем OP-коде:

    describe('datastoreServices', function() {

    beforeEach(module('MyApp'));

    // get a reference to the $httpBackend mock and to the service to test, and create a mock for DomainService
    var $httpBackend, datastoreServices, DomainService;
    beforeEach(inject(function(_$httpBackend_, _datastoreServices_) {
        $httpBackend = _$httpBackend_;
        datastoreServices = _datastoreServices_;
        DomainService = function() {
            return {
                host: 'http://localhost:7001/'
            };
        };
    }));

    // after each test, this ensure that every expected http calls have been realized and only them
    afterEach(function() {
        $httpBackend.verifyNoOutstandingExpectation();
        $httpBackend.verifyNoOutstandingRequest();
    });


    it('calls http backend to get data', function() {
        var data = {foo: 'bar'};

        // write $http expectation and specify a mocked server response for the request
        // see https://docs.angularjs.org/api/ngMock/service/$httpBackend
        $httpBackend.expectPOST('http://localhost:7001/factor', data).respond(201, {bar: 'foo'});

        var returnedData;
        datastoreServices.getData(data, DomainService).success(function(result) {
            // check that returned result contains
            returnedData = result;
            expect(returnedData).toEqual({bar: 'foo'});
        });

        // simulate server response
        $httpBackend.flush();

        // check that success handler has been called
        expect(returnedData).toBeDefined();
    });
});