1. ホーム
  2. angularjs

依存関係を持つAngularJSファクトリーのユニットテスト

2023-07-14 18:08:17

質問

Angularファクトリーをユニットテストする場合(Karma + Jasmineを使用)、テスト対象のファクトリーにスタブ依存関係を注入するにはどうすればよいですか?

ここに私のファクトリーがあります。

mod = angular.module('myFactoryMod', []);

mod.factory('myFactory', [
  '$log', 'oneOfMyOtherServices', function($log, svc) {
    return makeSomethingThatDoesSomethingWithTheseDependencies($log, svc);
  }
]);

oneOfMyOtherServices は私のファクトリーをインスタンス化するときに必要です。

これが私のテストです。

it('can get an instance of my factory', function() {
  var oneOfMyOtherServicesStub;

  angular.mock.module('myFactoryMod');

  oneOfMyOtherServicesStub = {
    someVariable: 1
  };

  //****How do I get my stub in my target? ****

  angular.mock.inject(['myFactory', function(target) {

      expect(target).toBeDefined();

    }
  ]);
})

N.B. 私は知っています。 $controller はコントローラに対してこれを可能にしますが、ファクトリーに対しては同等のものが見当たりません。

どのように解決するのですか?

私が知っている限りでは、このようなことを実現する方法は2つあります。

  1. 使用する $provide と匿名モジュールを使ってモックをインジェクトします。
  2. モックにしたいサービスをインジェクトし、jasmineのスパイ機能を使ってモック値を提供します。

2つ目の方法は、テスト対象のコードが注入されたサービス上でどのメソッドを呼び出すかを正確に知っていて、それらを簡単にモック化できる場合にのみ有効です。 あなたは(メソッドではなく)サービスのデータプロパティにアクセスしているようなので、最初のオプションを追求することが最善かもしれません。

使用方法 $provide を使うと、大体こんな感じになります。

describe('myFactory', function () {
  // Load your module.
  beforeEach(module('myFactoryMod'));

  // Setup the mock service in an anonymous module.
  beforeEach(module(function ($provide) {
    $provide.value('oneOfMyOtherServicesStub', {
        someVariable: 1
    });
  }));

  it('can get an instance of my factory', inject(function(myFactory) {
    expect(myFactory).toBeDefined();
  }));
});