【发布时间】:2020-07-25 18:40:11
【问题描述】:
您好,谁能告诉我为什么这个服务测试在它应该失败的时候总是通过? 如果这很重要,我正在使用 Jest。 数据是数组中的 1 个对象,但测试需要 5 个并且仍然通过! (控制台日志确实被命中并返回数据); 我无法在订阅中触发期望调用,我不明白为什么。
控制台日志正在运行,但预期没有。 我一定在做一些非常愚蠢的事情,但不确定是什么。 任何人都可以解释什么是错的吗?
import { TestBed, inject, getTestBed } from '@angular/core/testing';
import { HttpTestingController, HttpClientTestingModule } from '@angular/common/http/testing';
import { DataHandlerService } from './data-handler.service';
describe('DataHandlerService', () => {
let injector: TestBed;
let service: DataHandlerService;
let httpMock: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [DataHandlerService]
});
injector = getTestBed();
httpMock = TestBed.get(HttpTestingController);
service = TestBed.get(DataHandlerService);
});
afterEach(() => {
httpMock.verify();
});
it('should be created', () => {
service = TestBed.get(DataHandlerService);
expect(service).toBeTruthy();
});
describe('getData()', () => {
it('should trigger call', () => {
const mockEvt = [{
audio: "N",
city: "Madrid",
country: "Spain",
date: "1930-01-01",
}];
service.getData('/test').subscribe(evtData => {
console.log('CALLING ..... ', evtData);
expect(evtData.length).toEqual(5);
expect(evtData[0].country).toBe('France');
});
const req = httpMock.expectOne("/test");
expect(req.request.method).toBe('GET');
req.flush(mockEvt);
});
});
});
这是我正在测试的服务。现在是基本的。 核心测试运行后会添加更多细节。
@Injectable({
providedIn: 'root'
})
export class DataHandlerService {
constructor(private http: HttpClient) { }
getData(urlToFetch: string): Observable<any[]> {
return this.http.get<any[]>(urlToFetch);
}
}
【问题讨论】:
-
你在哪里阅读
evtData? -
evtData 是服务响应返回的数据。
-
您应该在订阅代码末尾使用 done 回调,'req.flush(mockEvt);done();'
-
我将 done() 应用到 it() 但它没有工作 - 失败的测试仍然通过。 it('should trigger call', (done) => { /// blah blah req.flush(mockEvt);done(); });
-
使用 async then done() 会导致错误。 it('应该触发调用', async((done) => { /// blah blah req.flush(mockEvt);done(); }));错误:TypeError:完成不是函数
标签: angular unit-testing jestjs angular-httpclient