unit-testing - 如何修复“错误:无法从同步测试中调用 setTimeout。” 测试服务时?
问题描述
我正在尝试使用 Jasmine + Karma 对使用 ngx-socket-io 的非常基本的服务进行单元测试。
我不断得到Error: Cannot call setTimeout from within a sync test.
这是我的服务:
import { Injectable } from '@angular/core';
import { Socket } from 'ngx-socket-io';
import { Message } from 'src/app/models/message';
@Injectable({
providedIn: 'root'
})
export class MessageService {
constructor(private socket: Socket) { };
newMessages(){
return this.socket.fromEvent<Message>('newMessage');
}
newMessage(message: String) {
this.socket.emit('messageSent', message);
}
}
这是我的单元测试:
import { TestBed } from '@angular/core/testing';
import { MessageService } from './message.service';
import SocketMock from 'socket.io-mock';
import { WrappedSocket } from 'ngx-socket-io/src/socket-io.service';
describe('MessageService', () => {
let service: MessageService;
let socket: WrappedSocket = new WrappedSocket(new SocketMock());
beforeEach(() => {
TestBed.configureTestingModule({
providers :[
MessageService,
{provide: WrappedSocket, useValue: socket}
]
});
service = TestBed.get(MessageService);
});
it('should be created', async () => {
expect(service).toBeTruthy();
});
});
这是完整的错误输出:
Error: Cannot call setTimeout from within a sync test.
at SyncTestZoneSpec.onScheduleTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone-testing.js:366:1)
at ZoneDelegate../node_modules/zone.js/dist/zone.js.ZoneDelegate.scheduleTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:404:1)
at Zone../node_modules/zone.js/dist/zone.js.Zone.scheduleTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:238:1)
at Zone../node_modules/zone.js/dist/zone.js.Zone.scheduleMacroTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:261:1)
at scheduleMacroTaskWithCurrentZone (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:1245:1)
at http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:2317:1
at proto.<computed> (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:1569:1)
at Request.create (http://localhost:9876/_karma_webpack_/webpack:/node_modules/engine.io-client/lib/transports/polling-xhr.js:268:1)
at new Request (http://localhost:9876/_karma_webpack_/webpack:/node_modules/engine.io-client/lib/transports/polling-xhr.js:165:1)
at XHR.request (http://localhost:9876/_karma_webpack_/webpack:/node_modules/engine.io-client/lib/transports/polling-xhr.js:92:1)
我只想测试该服务是否已创建。发生了什么事,我怎样才能让测试通过?
解决方案
尝试使用 async beforeEach。可能从那里调用 setTimeout 。
推荐阅读
- php - Symfony - 生成新 APP_SECRET 的终端命令
- javascript - 在我的 javascript 计算器中添加“退格”和“删除”键盘输入
- python - 在节点集中指定的节点处提取应变 [Abaqus python odb 访问]
- spring - 使用Java lambda parallelStream时RabbitMQ Spring“无法确定查找键的目标ConnectionFactory”
- python - Tensorflow:避免每次运行都下载 Inception V3
- javascript - 全局上下文中的 Javascript this 不起作用,或者看起来像 console.log 工作但使用 ref 不起作用
- certificate - 使用 Certbot 我很难为多个域使用单独的证书
- filter - 来自drawtext的ffmpeg drawbox高度
- javascript - 如何显示评级星 Laravel 和 Ajax
- python - 根据两种不同的分布生成一个样本