【发布时间】:2022-04-01 00:38:58
【问题描述】:
在 Angular 9 中,我有一个如下所示的加载器服务。
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
export interface LoaderState {
show: boolean;
}
@Injectable({
providedIn: 'root'
})
export class LoaderService {
private loaderSubject = new Subject<LoaderState>();
loaderState = this.loaderSubject.asObservable();
constructor() { }
show() {
this.loaderSubject.next({show: true} as LoaderState);
}
hide() {
this.loaderSubject.next({show: false} as LoaderState);
}
}
我想测试show() 和hide() 方法。为此,我编写了如下规范。
it('should show', (done) => {
spyOn(loaderService, 'show').and.callThrough();
loaderService.show();
expect(loaderService.show).toHaveBeenCalled();
loaderService.loaderState.subscribe((state) => {
expect(state).toBe({show: true});
done();
});
});
但是当我运行它时出现以下错误
Chrome 86.0.4240 (Windows 10.0.0) LoaderService 应该显示 FAILED 错误:超时 - 5000 毫秒内未调用异步回调(由 jasmine.DEFAULT_TIMEOUT_INTERVAL 设置)
在问这个问题之前我已经搜索了很多。但似乎找不到合适的解决方案。我是 Jasmin 单元测试的新手。任何帮助表示赞赏。
编辑:发布完整的规范文件以供参考。
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { LoaderComponent } from './loader.component';
import { LoaderService } from './loader.service';
describe('LoaderService', () => {
let component: LoaderComponent;
let fixture: ComponentFixture<LoaderComponent>;
let loaderService: LoaderService;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ LoaderComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(LoaderComponent);
component = fixture.componentInstance;
fixture.detectChanges();
loaderService = TestBed.inject(LoaderService);
});
it('should be create', () => {
expect(loaderService).toBeTruthy();
});
it('should show', (done) => {
spyOn(loaderService, 'show').and.callThrough();
loaderService.show();
expect(loaderService.show).toHaveBeenCalled();
loaderService.loaderState.subscribe((state) => {
expect(state).toBe({show: true});
done();
});
});
});
【问题讨论】:
-
你模拟了你的服务吗?
-
@Fran 我需要模拟吗?服务非常简单。我不能在不嘲笑的情况下进行测试吗?我正在使用测试台在每个之前注入。
-
抱歉,您是对的,我认为您正在测试不同的服务。
state在您的订阅中的价值是多少? -
@Fran
show()函数将值设置为{show: true}。我不认为订阅被调用,因此时间问题说异步回调没有被调用。 -
你能提供整个.spec吗?
标签: angular unit-testing jasmine karma-jasmine