我有一个异步函数,我想同时测试成功和失败。函数成功时返回一个字符串,失败时抛出。我在测试失败上失败得很惨。下面是我的代码:
我通过注释失败的代码并在注释中添加结果来禁用
'use strict';
const path = require('path');
const fs = require('fs');
const getKmlFilename = require('./getKmlFileName.js');
const createGoodFolder = () => {
const folderPath = fs.mkdtempSync('/tmp/test-getKmlFilename-');
const fileDescriptor = fs.openSync(path.join(folderPath, 'doc.kml'), 'w');
fs.closeSync(fileDescriptor);
return folderPath;
};
const createEmptyFolder = () => fs.mkdtempSync('/tmp/test-getKmlFilename-');
describe('/app/lib/getKmlFilename', () => {
// Success tests
test('Should return a KML filename', async () => {
const result = await getKmlFilename(createGoodFolder());
expect(result).toMatch(/\.kml$/);
});
// Failure tests
test('Should throw if no KML files in folder', () => {
// Expected one assertion to be called but received zero assertion calls.
// expect.assertions(1);
// expect(function).toThrow(undefined)
// Received value must be a function, but instead "object" was found
//return getKmlFilename(createEmptyFolder())
// .catch(e => expect(e).toThrow());
// expect(string)[.not].toMatch(expected)
// string value must be a string.
// Received:
// object:
// [Error: No valid KML file in /tmp/test-getKmlFilename-j2XxQ4]
return getKmlFilename(createEmptyFolder())
.catch(e => expect(e).toMatch('No valid KML file in'));
});
test('Should throw if no KML files in folder - try/catch version',
async () => {
// Expected one assertion to be called but received zero assertion calls.
// expect.assertions(1);
try {
const result = await getKmlFilename(createEmptyFolder());
} catch (e) {
// Received value must be a function, but instead "object" was found
// expect(e).toThrow();
// expect(string)[.not].toMatch(expected)
// string value must be a string.
// Received:
// object:
// [Error: No valid KML file in /tmp/test-getKmlFilename-3JOUAX]
expect(e).toMatch('No valid KML file in');
}
});
});
正如你所看到的,什么都不起作用。我相信我的测试几乎是第一个失败测试的Promises示例和最后一个失败测试的Async/Await示例的完全副本,但是没有一个可以工作。
我相信与Jest文档中的示例的不同之处在于,它们展示了如何测试函数
在节点控制台中检查函数时,我得到了以下日志:
// import function
> getKml = require('./getKmlFileName.js')
[AsyncFunction: getKmlFilename]
// trying it with a proper folder shows we get a Promise
> getKml('/tmp/con')
Promise {
<pending>,
domain:
Domain {
domain: null,
_events: { error: [Function: debugDomainError] },
_eventsCount: 1,
_maxListeners: undefined,
members: [] } }
// trying it with a failing folder shows it's a rejected promise which throws
> getKml('/tmp/sin')
Promise {
<pending>,
domain:
Domain {
domain: null,
_events: { error: [Function: debugDomainError] },
_eventsCount: 1,
_maxListeners: undefined,
members: [] } }
> (node:10711) UnhandledPromiseRejectionWarning: Error: No valid KML file in /tmp/sin
at getKmlFilename (/home/flc/soft/learning/2018.06.08,jest/getKmlFileName.js:14:11)
at <anonymous>
at process._tickDomainCallback (internal/process/next_tick.js:228:7)
(node:10711) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:10711) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
正如您从内联注释中看到的,这个函数正在做它应该做的事情,但是我不知道如何测试它。如有任何帮助,我们将不胜感激。
我担心这里的代码看起来太复杂了,我准备了一个存储库,里面包含了我的不幸学习笑话
更新2018.06.12:
不知怎么的,我的消息被打乱了,丢失了第一部分,也就是我要测试的实际代码,我很抱歉,下面是:
>
'use strict';
const globby = require('globby');
const path = require('path');
const getKmlFilename = async (workDir) => {
const pattern = path.join(workDir, '**/*.kml');
const files = await globby(pattern);
if (files && files.length > 0) {
// Return first KML found, if there are others (improbable), ignore them
return path.basename(files[0]);
} else {
throw new Error(`No valid KML file in ${workDir}`);
}
};
module.exports = getKmlFilename;
null
return getKmlFilename(createEmptyFolder())
.catch(e => expect(e).toMatch('No valid KML file in'));
如果诺言兑现,它也不会抱怨。
在第二次测试中
try {
const result = await getKmlFilename(createEmptyFolder());
} catch (e) {
...
}
如果承诺解决了,它也不会抱怨,因为它不会进入catch块。
要检验承诺,问自己以下几个问题:
开玩笑地说,你应该能做到这一点:
请注意,异步函数总是返回一个值(一个Promise对象),因此“通常的”
我对Jest是新手,目前只是在玩一些现有功能的测试。我有一个函数,它获取一个数据数组(来自JSON文件),并将其映射到特定的位置,绘制点。 这是功能点: plotPoint将JSON数据作为参数。该函数之所以有效,是因为它在控制台中正确记录数据,而其他功能按预期工作。 但测试总是失败: 绘图点。测验js 返回此错误: 我认为可能函数是在jsonfile之前的测试中运行的。json已加载,因此我尝试
在我的React项目中,我正在单元测试一个调用另一个异步函数的异步函数。 尽管每次测试时,结果都是一个空的promise{},而不是预期的数据。我在网上找到了很多模拟异步“getJobStatuses”函数结果的实现,但都没有成功(显示了我在这里使用的实现)。为了测试调用它的函数(getAllJobs),模拟该函数结果的正确方法是什么
我正在尝试创建一个名为<code>AuditScope<code>的自定义范围类,通过<code>AuditScope.current<code>可以访问当前范围。 如果有嵌套的作用域,则当前作用域是嵌套最多的作用域。 我希望这是线程安全的,所以我使用来确保当前范围属于当前异步上下文,并且不会与其他请求发生冲突。如果你们有人遇到过,这类似于类。 下面是我的作用域类: 我的所有测试都单独通过,但是如
用mocha测试一个函数是非常简单的,但是,在JavaScript的世界中,更多的时候,我们编写的是异步代码,所以,我们需要用mocha测试异步函数。 我们把上一节的hello-test工程复制一份,重命名为async-test,然后,把hello.js改造为异步函数: const fs = require('mz/fs'); // a simple async function: module
问题内容: 我对Jest和测试来说相对较新。我有一个带有输入元素的组件: 我想要一个测试来检查输入元素的功能是否以输入元素的属性作为参数。这是我到目前为止所走的距离: 我从这里的第一个解决方案开始模拟Jest And中的按钮单击:https : //facebook.github.io/jest/docs/en/mock- functions.html 编辑:运行以上会引发以下错误: 问题答案: