web-dev-qa-db-ja.com

値を返さないメソッドのテスト(jasmineangular4)

私はテストにジャスミンを使用しているプロジェクトに取り組んでいます。メソッドが値を返さないが、クラスプロパティを設定するだけの状況があります。値を返すメソッドでスパイを使用する方法は知っていますが、値を返さないメソッドでスパイを使用する方法がわかりません。オンラインで検索しましたが、適切なリソースが見つかりませんでした。そしてその方法は以下の通りです

updateDvStatus() {
    this._http.get(this.functionControlUrl).subscribe(() => {
    this._active = true;
    }, (error) => {
      this.errorStatusCode = error.status;
      this.errorPageService.setStatusCode(this.errorStatusCode);
    })
  }

どんな助けでもいただければ幸いです。

8

何も返さないメソッドをテストする方法

以下は、何も返さないメソッドをテストする例です。

_var serviceUnderTest = {
  method: function() {
    console.log('this function doesn't return anything');
  }
};

it('should be called once', function() {
  spyOn(serviceUnderTest, 'method');

  serviceUnderTest.method();

  expect(serviceUnderTest.method.calls.count()).toBe(1);
  expect(serviceUnderTest.method).toHaveBeenCalledWith();
});
_

コールバックをテストする方法

subscribe()関数に渡した関数が期待どおりに機能するかどうかをテストすることは、あなたの本当の問題だと思います。 thatがあなたが本当に求めているものである場合、次のことが役立つかもしれません(私はこれを頭のてっぺんから書いたので、タイプミス)。

_var serviceUnderTest = {
  method: function() {
    this.someOtherMethod(function() { this.active = true; });
  },
  someOtherMethod: function(func) {
    func();
  }
}

it('should execute the callback, setting "active" to true', function() {
  spyOn(serviceUnderTest, 'someOtherMethod');

  serviceUnderTest.method();

  expect(serviceUnderTest.someOtherMethod.calls.count()).toBe(1);
  var args = serviceUnderTest.someOtherMethod.calls.argsFor(0);
  expect(args.length).toBeGreaterThan(0);
  var callback = args[0];
  expect(typeof callback).toBe('function');

  expect(serviceUnderTest.active).toBeUndefined();
  callback();
  expect(serviceUnderTest.active).toBe(true);
});
_

あなたのシナリオ

古い構文で申し訳ありませんが、私はこれを頭から書いているので、見栄えがするよりもうまくいくほうがいいですが、いくつかのタイプミスがあります。また、私はObservablesを使用したことがないので、これから紹介する方法よりも優れたテスト方法がある可能性があります。おそらく、新しいObservablesを作成し、サブスクライブをスパイすることになります。これは頭​​から離れているので、やらなければなりません。

_it('should subscribe with a function that sets _active to true', function() {
  // Arrange
  var observable = jasmine.createSpyObj('Observable', ['subscribe']);
  spyOn(http, 'get').and.returnValue(observable);

  // Act... (execute your function under test)
  service.updateDvStatus();

  // Assert
  expect(http.get.calls.count()).toBe(1);
  expect(http.get).toHaveBeenCalledWith(service.functionControlUrl);
  expect(observable.subscribe.calls.count()).toBe(1);
  var args = observable.subscribe.calls.argsFor(0);
  expect(args.length).toBeGreaterThan(0);
  var callback = args[0];
  expect(typeof callback).toBe('function');

  service._active = false;
  callback();
  expect(service._active).toBe(true);
});
_
6
Seth Flowers