typescript - 在 jasmine 中调用 http get 并没有超时
问题描述
我在嘲笑我http.get
,但我的测试仍然超时。
错误:超时 - 异步函数未在 5000 毫秒内完成(由 jasmine.DEFAULT_TIMEOUT_INTERVAL 设置)
我已经做了我能想到和读到的一切。done
方法,我HttpClientTestingModule
已经尝试flush
了expectOne
结果,但无济于事。
在控制台中,我看到了“testee.res”结果,但没有看到“tester.result”。
被试:
@Injectable({
providedIn: 'root'
})
export class MetadataService {
constructor(
private http: HttpClient,
) { }
public myMethod(): Observable<string> {
const res = this.http.get<string>('myurl');
console.log('testee.res',res);
return res;
}
}
测试人员:
describe('MetadataService', () => {
let service: MetadataService;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
HttpClientModule,
HttpClientTestingModule,
],
providers: [
{
provide: HttpClientTestingModule,
},
]
});
service = TestBed.inject(MetadataService);
});
it('should call http get', (done) => {
const http = TestBed.inject(HttpTestingController);
// Act.
service.myMethod().subscribe(result => {
console.log('tester:result',result);
// Assert.
http.expectOne('myurl');
done();
});
});
});
解决方案
HttpClientModule
应该被删除。它没有改变测试结果;但这让我想知道在被测者身上注射了什么HttpClient
。我之所以拥有它,是因为在早期的测试中,由于我不知道的原因需要它。
删除done()
. 我知道不再需要了,但我不知道为什么保留它会保留超时错误。我相信(d)它只是为 Jasmine 设置一个标志来检查测试是否完成。正如我done
在subscribe
块中调用的那样,应该设置标志。但我想它比这更复杂。
有人知道吗?
必须在通话expectOne
后移到外面。
原因是在被调用之前不返回任何东西。在内部调用使块永远不会运行,因为没有返回。因此超时。subscribe
http.get
http.expectOne
expectOne
subscribe
subscribe
get
describe('MetadataService', () => {
let service: MetadataService;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
HttpClientTestingModule,
],
providers: [
{
provide: HttpClientTestingModule,
},
]
});
service = TestBed.inject(MetadataService);
});
it('should call http get', () => {
const http = TestBed.inject(HttpTestingController);
// Act.
service.myMethod().subscribe(result => {
console.log('tester:result',result);
});
// Assert.
http.expectOne('myurl');
});
});
推荐阅读
- javascript - 是否可以在内存中加载文档?
- c# - HQL 和 Linq 的 NHibernate IUserType 和自定义函数
- php - Laravel - 如何清除数组语言的缓存
- node.js - MalformedResponse expected_inputs[0].input_prompt.rich_initial_prompt:“carousel_browse”仅支持支持 Web 浏览器的客户端
- javascript - PHP 将 PHP 数据传递到 JS 数组中
- haskell - 为什么surfaceDimensions(出现)返回一个双封闭向量(V2 V2 CInt)?
- php - 从 Eclipse PHPUnitLogger 错误和端口 7478 错误运行 PHPUnit
- python - 如何将来自ansible play的大型json结果传递给python脚本
- r - 如何对两列中具有目标值的行中的值求和?
- sql - 如何计算表格中分组值的次数?