【问题标题】:Subscribe EventEmmiter in an other service angular unit test在另一个服务角度单元测试中订阅 EventEmitter
【发布时间】:2021-07-09 05:09:33
【问题描述】:

我尝试测试 EventEmitter 在角度服务中是否正确调用。但我有两个服务。

服务一号

public methodToTestInServiceOne(message: string) {
  this.serviceTwo.methodInServiceTwo(message);
}

服务二

public onMessageStart = new EventEmitter();
public onMessageEnd = new EventEmitter();

public methodInServiceTwo(message: string): void {
    this.onMessageStart.emit(message);
    /* Code... */
    this.onMessageEnd.emit(message);
  }

单元测试服务一

describe("serviceOne", (): void => {
  let serviceOne: ServiceOne;
  let serviceTwo: ServiceTwo;

  beforeEach((): void => {
    TestBed.configureTestingModule({ providers: [] });
    service = TestBed.inject(ServiceOne);
    serviceTwo = TestBed.inject(ServiceTwo);
  });

  describe("methodToTestInServiceOne", (): void => {
    it("should call EventEmmiter", (): void => {
      let isMessageSend: boolean = false;

      serviceTwo.onMessageEnd.subscribe((message: string): void => {
        isMessageSend = true;
      });

      serviceOne.methodToTestInServiceOne("Hello World !");

      expect(isMessageSend).toBeTruthy();
    });
  });
});

此代码不起作用,但如果我直接调用我的服务二。

serviceTwo.methodInServiceTwo("Hello World !")

测试有效! 请问,如何测试我的 EventEmitter 调用 serviceOne ?

【问题讨论】:

    标签: angular unit-testing jasmine eventemitter angular-event-emitter


    【解决方案1】:

    尝试将ServiceOne 和ServiceTwo 放入TestBed 的providers 数组中。

    试试这个:

    describe("serviceOne", (): void => {
      let serviceOne: ServiceOne;
      let serviceTwo: ServiceTwo;
    
      beforeEach((): void => {
        TestBed.configureTestingModule({ 
          providers: [
            ServiceOne,
            ServiceTwo, // !! - Add these two here - !!
          ] 
        });
        service = TestBed.inject(ServiceOne);
        serviceTwo = TestBed.inject(ServiceTwo);
      });
    
      describe("methodToTestInServiceOne", (done): void => { // !! add done here
        it("should call EventEmmiter", (): void => {
          let isMessageSend: boolean = false;
    
          serviceTwo.onMessageEnd.subscribe((message: string): void => {
            console.log(`1.) subscribing to message, ${message}`);
            console.log(`2.) Setting isMessageSend to true`);
            isMessageSend = true;
            done(); // !! call done to let Jasmine know we are done with the test
          });
    
          serviceOne.methodToTestInServiceOne("Hello World !");
          console.log(`3.) Checking isMessageSend is truthy`);
          expect(isMessageSend).toBeTruthy();
        });
      });
    });
    
    public methodToTestInServiceOne(message: string) {
      console.log('[Service One] calling method in service two');
      this.serviceTwo.methodInServiceTwo(message);
    }
    ....
    public methodInServiceTwo(message: string): void {
        this.onMessageStart.emit(message);
        /* Code... */
        console.log('[Service Two] onMessageEnd being emitted');
        this.onMessageEnd.emit(message);
      }
    

    【讨论】:

    • 我为提供商实现了这两项服务,但不幸的是它没有工作
    • 我通过添加console.logs 进行了一些编辑。我认为订单可以关闭。确保您看到1.) ...,然后是2.)..,然后是3.)....。如果您看到 3 然后 1 然后 2,那是时间问题,或者您可能会看到 3,但没有看到 1 和 2,这意味着测试从未进入 subscribe。
    • 我从来没有看到 console.log 1 和 2。订阅没有被调用。但是当我直接调用 serviceTwo 时调用了 subscribe 并且时机很好
    • 查看新的 console.logs 并确保您看到它们并添加 done。我认为它永远不会进入您的订阅。可能是因为早subscriber。
    • 谢谢 AliF50 !在使用最后一个 console.log 的订阅者进行测试后,一切正常并及时调用。问题来自我的代码...
    猜你喜欢
    • 2020-01-15
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多