代码之家  ›  专栏  ›  技术社区  ›  D. Berg

Jasmine单元测试observable subscribe不会触发

  •  3
  • D. Berg  · 技术社区  · 8 年前

    我用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();
      });
    });
    
    1 回复  |  直到 8 年前
        1
  •  5
  •   Philipp Meissner    8 年前

    如果 service.ItemsToFilterBy$ Subject<any>() BehaviorSubject ReplaySubject 同意 服务ItemsToFilterBy项目$ 在规格的开头,请阅读 here

    使用 callThrough() 方法依据 jasmine 当你监视一种方法时。 spyOn(service.ItemsToFilterBy$, 'subscribe')

    i、 e。

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

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

    推荐文章