8

私は、yeoman で生成した angularjs アプリケーションを持っています。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 の mock フォルダーを使用できないかと思います。モック パーツをモック フォルダに移動して、すべての単体テストに使用することはできますか?

このフォルダーの例やドキュメントは見つかりませんでした。モック フォルダーの使用方法の例またはドキュメントを教えてください。

4

2 に答える 2

7

基本的に、angular-mocks.js を見て、このようなことをしました。5 月
のアプリが ql と呼ばれるとしましょう。そして、モックしたいloginServiceがあります:

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
    });
  }));
});
于 2013-11-12T19:37:10.333 に答える
3

@gerasalus の例は役に立ちますが、質問に答えるには:

mocksは、プロジェクトを整理し、テストのコードを短く要点を保つためにコードを配置する単なるフォルダーです。すべてのモックを 1 か所に保持することで、テストでの再利用が容易になります... あるテストから別のテストにコピーすることは、DRY の観点からは悪い習慣です。

たとえば、「Foo」というサービスがあるとします。

app/service/foo.js

次に、「FooMock」と呼ばれるそのサービスのモックを作成する場合があります

test/mocks/service/foo.js

そして、gerasulus の回答に示されているように、テストを作成し、必要なモックを挿入します。

于 2015-06-05T15:36:04.800 に答える