在组件中使用debounceTime进行Angular2单元测试“不能在异步区域测试中使用setInterval”

时间:2017-01-10 17:54:36

标签: unit-testing angular typescript rxjs5

我正在尝试测试在元素可见时呈现背景图像的组件。我检测滚动调整大小事件的可见性,并减轻我从RxJS使用Request的负载。然而,这是一个问题,因为单元测试失败了

  

失败:无法在异步区域测试中使用setInterval。

我知道这是一个问题,因为if (HttpContext.Current == null || HttpContext.Current.Request.Url.Host.IndexOf("www.izenda.com",StringComparison.CurrentCultureIgnoreCase) > -1) return; 的异步性质,但我不确定如何阻止此/ mock debounceTime进行测试。

这是组件

debounceTime

这是单元测试

debounceTime

2 个答案:

答案 0 :(得分:0)

您可以使用TestScheduler交换debounceTime使用的默认调度程序。然后,它将不再使用setInterval计划未来的值。我不是100%确定你的测试是否会在没有去抖动的情况下成功,否则你将不得不做一个真正的Rx测试,你让TestScheduler在虚拟时间运行,这样它就会达到所需的最终状态,好像你的去抖一样触发了IRL

答案 1 :(得分:0)

我遇到了同样的问题,使用茉莉花的“完成”有什么帮助。虽然我必须承认我不熟悉注入,但我不知道你正在运行什么版本的角度等等,我正在努力调整你的代码,以它对我有用的方式:

...
describe(`${collectionName} ListComponent`, () => {
let fixture;
beforeEach(() => {
    TestBed.configureTestingModule({
        imports: [
            RouterLinkMockModule,
        ],
        declarations: [
            ListComponent,
        ],
        providers: [
            Router //I think you have to do that here if you do not use the inject
        ]
    });
});

it('should render 2 items in list', (done) => {
    fixture = TestBed.createComponent(ListComponent);
    fixture.componentInstance.data = data;
    fixture.detectChanges();
    const el = fixture.debugElement.nativeElement;
    expect(el.querySelectorAll('.box').length).toBe(2);
    done();
});
...

我不是100%确定这对你有用 - 我有另一种方法可以在名为'Page'的类中存储我需要的所有引用,就像在angular.io页面上建议进行测试一样。在那里我也称为创建组件,我认为这是“完成”应该涵盖的关键部分。 不确定这是否相关,但供参考:我使用角度2.3.1和业力1.2.0与jasmine-core 2.5.2

相关问题