【问题标题】:Jasmine unit testing observable subscribe does not triggerJasmine 单元测试可观察订阅不会触发
【发布时间】:2018-08-31 18:16:24
【问题描述】:

我将 Angular 5 与 Jasmine 和 Karma 一起使用。我正在尝试测试某个功能是否有效,但我的订阅在单元测试期间没有触发。这会导致我的单元测试失败,因为我正在使用 jasmine 的 done 功能。 我想让这个单元测试成功。

我已将超时间隔设置为 20 秒,以查看它是否只需要一段时间(它不应该)。

我也尝试过使用 async 和 fakeasync,但它不会触发。我可以让订阅触发吗?

这是我得到的代码:

describe('FilterService', () => {
  let service: FilterService;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [FilterService]
    });
    service = TestBed.get(FilterService);
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000;
  });

  it("SetItemsToFilterByAndApplyFilters should set ItemsToFilterBy and set the InFilter property", (done: DoneFn) => {
    //arrange
    let item1: any = new Organisation();
    item1.Id = 1;
    item1.InFilter = true;
    let item2: any = new Organisation();
    item1.Id = 2;
    item1.InFilter = false;

    let itemNew1: any = new Organisation();
    itemNew1.Id = 1;
    let itemNew2: any = new Organisation();
    itemNew2.Id = 2;

    service.SetItemsToFilterBy([item1, item2]);
    let spy = spyOn(service.ItemsToFilterBy$, 'subscribe');

    //act
    service.SetItemsToFilterByAndApplyFilters([itemNew1, itemNew2]);
    //assert
    service.ItemsToFilterBy$.subscribe(result => {
      let result1 = _.find(result, item => {
        return item.Id == itemNew1.Id;
      });

      let result2 = _.find(result, item => {
        return item.Id == itemNew2.Id;
      });

      expect(result1.InFilter).toBeTruthy();
      expect(result2.InFilter).toBeFalsy();
      done();
    });
  });
});

感谢 Basavaraj Bhusani,这是可以使用的代码

      it("SetItemsToFilterByAndApplyFilters should set ItemsToFilterBy and set the InFilter property", (done: DoneFn) => {

    //arrange
    let spy = spyOn(service.ItemsToFilterBy$, 'subscribe').and.callThrough();

    let item1: any = new Organisation();
    item1.Id = 1;
    item1.InFilter = true;
    let item2: any = new Organisation();
    item2.Id = 2;
    item2.InFilter = false;

    let itemNew1: any = new Organisation();
    itemNew1.Id = 1;
    let itemNew2: any = new Organisation();
    itemNew2.Id = 2;

    service.SetItemsToFilterBy([item1, item2]);

    //act
    service.SetItemsToFilterByAndApplyFilters([itemNew1, itemNew2]);

    //assert
    service.ItemsToFilterBy$.subscribe(result => {
      let result1 = _.find(result, item => {
        return item.Id == itemNew1.Id;
      });

      let result2 = _.find(result, item => {
        return item.Id == itemNew2.Id;
      });

      expect(result1.InFilter).toBeTruthy();
      expect(result2.InFilter).toBeFalsy();
      done();
    });
    expect(spy).toHaveBeenCalled();
  });
});

【问题讨论】:

  • 请提供您的服务代码。

标签: angular unit-testing jasmine karma-jasmine


【解决方案1】:

如果service.ItemsToFilterBy$Subject<any>(),而不是BehaviorSubjectReplaySubject,请在规范的开头订阅service.ItemsToFilterBy$。阅读here

当您监视某个方法时,请使用jasminecallThrough() 方法。 spyOn(service.ItemsToFilterBy$, 'subscribe')

const spy = spyOn(service.ItemsToFilterBy$, 'subscribe').and.callThrough();

阅读callThrough这里https://jasmine.github.io/2.0/introduction.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 2019-04-16
    • 2016-06-10
    • 2020-09-23
    相关资源
    最近更新 更多