角度2单位测试承诺

时间:2018-01-09 09:11:16

标签: angular unit-testing jasmine karma-jasmine

我通常使用fakeAsync来测试返回可观察量的订阅。但在这种罕见的场合,我需要做同样的事情,但是要做出承诺。

这是我的尝试:

Textview

这是我的实际代码:

   //Service Stub:

  const testService = {
       testMethod: 
        jasmine.createSpy('testMethod').and.callFake(() => new Promise(() => 'test'))
  };

   it('test example',() => {
      // Arrange
      const response = 'test';
      component.selected = undefined;

      // Act
      component['myMethod']();

      //Assert
      expect(component.selected).toEqual(response);
    });

基本上,需要知道如何等待" this.testService.testMethod"返回并设置选中。

目前,它还没有等待回归的承诺。

注意:我已更新当前的尝试。但是在期待中仍然未定义。

3 个答案:

答案 0 :(得分:0)

实际上我不确定我是否理解您的问题正确,但是使用async和await可能是一种解决方案!请参见下面的示例。

要测试的课程

import { Router } from '@angular/router';
...

@Injectable({
  providedIn: 'root'
})
export class NavigationService {

  constructor(public router: Router) {
  }

  // Function to test. Note, that the routers navigate function returns a promise.
  navigateToAdminsLandingPage(): void  {
    this.router.navigate(['admin']).then();
  }

测试返回模拟承诺的函数

import ...

describe('NavigationService', () => {

  let testObj: NavigationService;

  // Test setup.
  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [
        RouterTestingModule
      ]
    });
    testObj = TestBed.get(NavigationHelperService);
  });

  // Testing a promise with async and await.
  it('should navigate to admin landing page', async () => {
    const spy = spyOn(testObj.router, 'navigate').and.returnValue(Promise.resolve(true));

    await testObj.navigateToAdminsLandingPage();

    expect(spy).toHaveBeenCalledTimes(1);
    expect(spy).toHaveBeenCalledWith(['admin']);
  });
});

答案 1 :(得分:-1)

停止使用异步调用,只需创建承诺的模拟。

const ret = {}; // Give it the value you want. 
spyOn(component.testService, 'testMethod').and.callFake(() => {
  return Promise.resolve(ret); // Give it the value you want. 
});
// ...
// Do your thing ...
// ...
// Call the method
component.myMethod();
// Now, you can expect
expect(component.myMethod).toHaveBeenCalled();
expect(component.selected).toEqual(ret);

答案 2 :(得分:-2)

您可以尝试拨打tick() 通话后

(见https://angular.io/guide/testing#the-fakeasync-function