AngularJS $资源服务嘲弄,正确的方式

时间:2016-12-31 13:10:37

标签: angularjs unit-testing mocking

我对AngularJS $资源服务应该被用于测试的方式感到困惑。 我发现了两种使用$ httpBackend服务的方法。 一种方法(取自Pluralsight教程):

describe('test', function() {

    beforeEach(module('name'));

    it('text', inject(function($httpBackend) {
        $httpBackend.expectGET("/url");
        // some code
        $httpBackend.flush();
    });
}

另一种方式(从this SO answer复制):

describe('test', function () {
    var $httpBackend;
    beforeEach(angular.mock.module('name'));

    beforeEach(function () {
        angular.mock.inject(function ($injector) {
            $httpBackend = $injector.get('$httpBackend');
        })
    });

    describe('text', function () {
        it('text', inject(function (User) {
            $httpBackend.expectGET('/url')
                .respond([{
                    property: 'test'
                }]);

            // Some code

            $httpBackend.flush();
        }));

    });
});

我不明白为什么第一种方式,直接使用模块,而第二种方式 angular.mock.module 。然后httpBackend服务注入的方式不同。第二种方式更加冗长。如果第一种方式有效,那么第二种方式的冗长是什么意思呢?

1 个答案:

答案 0 :(得分:1)

没有正确的方法,这里应该记住几个不同的问题。

moduleangular.mock.module的快捷方式。后者可用于避免与CommonJS模块发生冲突。

使用angular.mock.inject的唯一原因与angular.mock.module保持一致,可以始终安全地缩短为inject

如果应该在多个规范中使用相同的服务,则使用

beforeEach(inject(...))

beforeEach(function () { inject(...) })beforeEach(inject(...))的详细版本。如果inject块中除了beforeEach之外应该有其他内容,请考虑将其拆分为多个beforeEach块,以提高可读性。

$injector.get只是冗长而且在风格或功能方面没有任何好处。如果服务是变量,它没有任何好处,但它提供了一种有用的模式,用于批量分配服务到this规范上下文,而无需多次枚举它们:

beforeEach(inject(function ($injector) {
  var self = this;

  ['$httpBackend', ...].forEach(function (depName) {
    self[depName] = $injector.get(depName);
  });
}));

it(function () {
  var self = this;

  self.$httpBackend...
});