从 Jasmine 中的注入服务调用方法

Calling a method from an injected service in Jasmine

我正在尝试对服务进行单元测试。我已经注入了服务,但是方法调用 getAllProducts() 似乎没有出现 运行 但是测试仍然通过了!

Plnkr

service.js

angular.module('vsApp')
  .factory('productsDataService', function($http) {

    var service = {

      getAllProducts: getAllProducts

    };

    // get all products

    function getAllProducts() {

      return $http.get('/apiv1/getAllProducts/').then(function(data) {

        return (data);

      });

    }

    return service;
  });

spec.js

// jasmine

describe('products data service', function () {

    var $httpBackend, productsDataService;

    beforeEach(module('vsApp'));

    beforeEach(inject(function(_$httpBackend_, _productsDataService_) {

        $httpBackend = _$httpBackend_;
        productsDataService = _productsDataService_;

    }));

    it('should get all products', inject(function() {
        console.info("get all");
        // mock response for the http call in the service

        $httpBackend.when('GET', '/apiv1/getAllProducts/')
            .respond({name: 'item', price: '932'});

        //this doesn't seem to run??
        productsDataService.getAllProducts().then(function(response) {
            expect(response.data.length).toBeGreaterThan(1);

        });

    }));

});

好的,你必须让它同步。 (所有待处理的请求都将得到解决)使用 $http.flush();

Working demo as expected

productsDataService.getAllProducts().then(function(response) {
    console.log(response);
    expect(response.data.length).toBeGreaterThan(999);

});

$httpBackend.flush(); // <=============== here.