在Yeoman AngularJS中使用模拟文件夹进行业力测试

using the mock folder for karma test in yeoman angularjs

本文关键字:测试 文件夹 模拟 AngularJS Yeoman      更新时间:2023-09-26

我有一个angularjs应用程序,它是用yeoman生成的。在 karma.conf 中.js引用了 test/mock/**/*.js。我很难找出如何使用这个文件夹。目前我有一个简单的服务:

'use strict';
angular.module('tvcalApp')
  .factory('Series', function ($resource) {
    return $resource('/search/:search');
  });

和测试

'use strict';
var $httpBackend;
describe('Service: Series', function () {
  // load the service's module
  beforeEach(module('tvcalApp'));
  // instantiate service
  var Series;
  beforeEach(inject(function (_Series_) {
    Series = _Series_;
  }));
  beforeEach(inject(function ($injector) {
      var url_get = '/search/The%20Simpsons';
      var response_get = [{"seriesid": "71663"}];
      $httpBackend = $injector.get('$httpBackend');
      $httpBackend.whenGET(url_get).respond(response_get);
  }));
  it('should return a list if search for The Simpsons', function () {
      var res = Series.query({search: 'The Simpsons'});
      $httpBackend.flush();
        expect(res[0].seriesid === 71663);
      });
});

这是有效的。但我想知道我是否可以使用 karma.conf.js 中的模拟文件夹进行模拟功能。是否可以将模拟部分移动到模拟文件夹中并将其用于所有单元测试?

我找不到此文件夹的任何示例或文档。有人可以指出我如何使用模拟文件夹的示例或文档吗?

基本上我已经做了这样的事情来查看角度模拟.js:
假设 可能应用程序被称为 ql。 我有一个登录服务,我想模拟:

mocks/servicesMock.js看起来像这样:

'use strict';
var ql = {};
ql.mock = {};
ql.mock.$loginServiceMockProvider = function() {
  this.$get = function() {
    var $service = {
      login: function() { }
    };
    return $service;
  };
};
angular.module('qlMock', ['ng']).provider({
  $loginServiceMock: ql.mock.$loginServiceMockProvider
});

然后在我的测试中,我可以$loginServiceMock

'use strict';
describe('LoginController tests', function () {
  // load the controller's module
  beforeEach(module('ql'));
  // load our mocks module
  beforeEach(angular.mock.module('qlMock'));
  var loginController,
    loginServiceMock,
    scope;
  // Initialize the controller and a mock scope
  // $loginSericeMock will be injected from serviceMocks.js file
  beforeEach(inject(function ($controller, $rootScope, $loginServiceMock) {
    scope = $rootScope.$new();
    loginServiceMock =  $loginServiceMock;
    loginController = $controller('LoginController', {
      $scope: scope,
      loginService: loginServiceMock
    });
  }));
});

@gerasalus的例子很有用,但要回答这个问题:

mocks只是一个文件夹,用于放置代码,以保持项目井井有条,测试中的代码简短而中肯。 通过将所有模拟保存在一个地方,可以更轻松地在测试中重用它们......从 DRY 的角度来看,将它们从一个测试复制到另一个测试将是不好的做法。

因此,例如

,您可能有一个名为"Foo"的服务。

app/service/foo.js

然后,您可以创建该服务的模拟,称为"FooMock"

test/mocks/service/foo.js

然后,您将创建测试并注入所需的任何模拟,如gerasulus的答案所示。