我喜欢testing-library
,在React项目中使用过很多,现在我正试图在Angular项目中使用它,但我一直在与巨大的错误输出作斗争,包括渲染的HTML文本。这不仅通常没有帮助(我找不到元素,这是HTML中不是(;但它会被截断,如果您在调试模式下运行,通常会在感兴趣的行之前被截断。
我只是把它作为一个库添加到标准的Angular Karma+Jasmine设置中。
如果HTML输出导致我的控制台窗口假脱机很长时间,我相信你可以说我正在测试的组件太大了,但我在Protractor中有很多集成测试,它们是SO SLOW:(.
我认为最好的解决方案是使用configure
方法并为getElementError
传递一个自定义函数,它可以满足您的需要。
您可以在此处阅读有关配置的信息:https://testing-library.com/docs/dom-testing-library/api-configuration
这方面的一个例子可能看起来像:
configure({
getElementError: (message: string, container) => {
const error = new Error(message);
error.name = 'TestingLibraryElementError';
error.stack = null;
return error;
},
});
然后,您可以将其放入任何单个测试文件中,或者使用Jest的setupFiles或setupFilesAfterEnv配置选项使其全局运行。
我假设您在项目中使用rtl运行jest。
我个人不会关闭它,因为它是为了帮助我们,但每个人都有办法,所以如果你有自己的理由,那就足够公平了。
1.如果您想为特定测试禁用错误,可以模拟console.error
it('disable error example', () => {
const errorObject = console.error; //store the state of the object
console.error = jest.fn(); // mock the object
// code
//assertion (expect)
console.error = errorObject; // assign it back so you can use it in the next test
});
2.如果您想在所有测试中使其静音,可以使用jest --silent
CLI选项。检查文档
上面甚至可能禁用rtl完成的DOM打印,我不确定,因为我没有尝试过,但如果你看看我链接的文档,它说
"阻止测试通过控制台打印消息">
现在,如果以上内容不起作用,那么除了DOM建议之外,几乎可以肯定的是,您已经禁用了所有内容。在这种情况下,您可以查看react-testing-library's
源代码,并找出用于这些print语句的内容。它是console.log
吗?它是console.warn
吗?当你得到它时,就像上面的选项1一样模拟它
更新
经过一番挖掘,我发现所有的testing-library
DOM打印都建立在prettyDOM()
之上;
虽然prettyDOM()
不能被禁用,但您可以将行数限制为0,这只会给您错误消息和消息下面的三个点...
。
这是一个打印输出的例子,我搞砸了:
TestingLibraryElementError: Unable to find an element with the text: Hello ther. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.
...
您所需要做的就是在执行测试套件之前传递一个环境变量,因此,例如,对于npm脚本,它看起来像:
DEBUG_PRINT_LIMIT=0 npm run test
这是单据
更新2:
根据github上的OP的FR,这也可以在不注入全局变量来限制PrettyDOM行输出的情况下实现(以防在其他地方使用(。getElementError
配置选项需要更改:
dom测试库/src/config.js
// called when getBy* queries fail. (message, container) => Error
getElementError(message, container) {
const error = new Error(
[message, prettyDOM(container)].filter(Boolean).join('nn'),
)
error.name = 'TestingLibraryElementError'
return error
},
调用堆栈也可以删除
您可以通过使用config设置DOM测试库消息构建函数来更改消息的构建方式。在我的Angular项目中,我将其添加到test.js
:
configure({
getElementError: (message: string, container) => {
const error = new Error(message);
error.name = 'TestingLibraryElementError';
error.stack = null;
return error;
},
});
答案如下:https://github.com/testing-library/dom-testing-library/issues/773通过https://github.com/wyze.