我正在尝试将jest
与@nrwl/nx
创建的Angular项目一起使用。我已关注this文章,将我的应用程序从使用karma
转换为jest
。
我遇到的问题是,即使我的测试通过了,由于某种原因,控制台中也会显示以下错误:
console.error node_modules/jsdom/lib/jsdom/virtual-console.js:29
Error: Error: connect ECONNREFUSED 127.0.0.1:80
at Object.dispatchError (\node_modules\jsdom\lib\jsdom\living\xhr-utils.js:65:19)
at Request.client.on.err (\node_modules\jsdom\lib\jsdom\living\xmlhttprequest.js:676:20)
at Request.emit (events.js:187:15)
at Request.onRequestError (\node_modules\request\request.js:881:8)
at ClientRequest.emit (events.js:182:13)
at Socket.socketErrorListener (_http_client.js:391:9)
at Socket.emit (events.js:182:13)
at emitErrorNT (internal/streams/destroy.js:82:8)
at emitErrorAndCloseNT (internal/streams/destroy.js:50:3)
at process._tickCallback (internal/process/next_tick.js:63:19) undefined
我只有一个测试,那就是:
import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';
import { RouterTestingModule } from '@angular/router/testing';
import { CommonUtilsModule } from '@lib/common-utils';
describe('AppComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [RouterTestingModule, CommonUtilsModule],
declarations: [AppComponent]
}).compileComponents();
}));
it('should create the app', async(() => {
const fixture = TestBed.createComponent(AppComponent);
const app = fixture.debugElement.componentInstance;
expect(app).toBeTruthy();
}));
});
由于某些原因,如果我删除以下行,则不会显示控制台错误:
const fixture = TestBed.createComponent(AppComponent);
我已经看了好几个小时的错误,但似乎无法弄清楚是什么原因引起的。我没有在测试或组件中执行任何http请求,因此不知道为什么说ECONNREFUSED
。
有人以前有这个错误吗?
谢谢
答案 0 :(得分:0)
当您尝试向不可用的本地主机服务发出请求时,此消息很常见。
让我们考虑一下我正在运行一个脚本,该脚本使用了在localhost:80下执行的node.js服务。如果我的节点实例未运行,我会收到像您一样的消息。
我认为正在发生的事情是您已设置端口以检查80,通常更常见的是默认端口8080。
答案 1 :(得分:0)
如angular.io关于compileComponents
所述:
配置完毕后,异步编译测试模块。如果任何测试模块组件具有templateUrl或styleUrls,则必须调用此方法,因为获取组件模板和样式文件必须是异步的。见上文。
在调用compileComponents之后,将在当前规范期间冻结TestBed配置。
因此Jasmine&Angular本机使用fetch来获取HTML,并且必须调用compileComponents
才能使这些HTML文件可访问。
我不确定为什么这样做是必需的,但是JSDOM显然不能处理这个问题。
我建议您使用软件包jest-preset-angular,该软件包将使用自定义处理器处理此问题。
请确保遵循其README.md中的安装说明,因为在撰写此评论时安装有点不稳定,并且不要过多地修改jest配置。 ts-jest
正在重写,并且预设尚未赶上最新版本。我强烈建议您仅通过npm安装jest和预设,以确保工作空间中没有ts-jest
的不兼容版本。这很关键,因为ts-jest
不遵循语义版本控制。
要注意的另一件事是,仅当您使用--runInBand
/ -i
开玩笑时,断点才会起作用。如果运行--watch
,则如果仅测试单个文件(使用文件名正则表达式模式即可实现),则带内运行将不起作用,并且断点只会命中。多个文件将在多个进程中进行测试,我猜这不是在检查模式下运行的,并且vscode /您喜欢的调试器无法连接。