- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我想编写一个测试,检查我的函数是否使用await
关键字调用其他函数。
我希望我的测试失败:
async methodA() {
this.methodB();
return true;
},
async methodA() {
await this.methodB();
return true;
},
methodA() {
return this.methodB()
.then(() => true);
},
process.nextTick
对该方法进行 stub 并强制其在其中返回假 promise ,但这似乎很丑陋,我不想在测试中使用
process.nextTick
或
setTimeout
等。
const { stub } = require('sinon');
const { expect } = require('chai');
const testObject = {
async methodA() {
await this.methodB();
},
async methodB() {
// some async code
},
};
describe('methodA', () => {
let asyncCheckMethodB;
beforeEach(() => {
asyncCheckMethodB = stub();
stub(testObject, 'methodB').returns(new Promise(resolve => process.nextTick(resolve)).then(asyncCheckMethodB));
});
afterEach(() => {
testObject.methodB.restore();
});
it('should await methodB', async () => {
await testObject.methodA();
expect(asyncCheckMethodB.callCount).to.be.equal(1);
});
});
await
的聪明方法是什么?
最佳答案
TLDR
如果methodA
调用await
上的methodB
,则Promise
返回的methodA
将无法解析,直到Promise
返回的methodB
解析为止。
另一方面,如果methodA
未在await
上调用methodB
,则Promise
返回的methodA
将立即解析Promise
返回的methodB
是否已解决。
因此,测试methodA
是否在await
上调用methodB
仅仅是测试Promise
返回的methodA
是否等待Promise
返回的methodB
解析之后再解决:
const { stub } = require('sinon');
const { expect } = require('chai');
const testObject = {
async methodA() {
await this.methodB();
},
async methodB() { }
};
describe('methodA', () => {
const order = [];
let promiseB;
let savedResolve;
beforeEach(() => {
promiseB = new Promise(resolve => {
savedResolve = resolve; // save resolve so we can call it later
}).then(() => { order.push('B') })
stub(testObject, 'methodB').returns(promiseB);
});
afterEach(() => {
testObject.methodB.restore();
});
it('should await methodB', async () => {
const promiseA = testObject.methodA().then(() => order.push('A'));
savedResolve(); // now resolve promiseB
await Promise.all([promiseA, promiseB]); // wait for the callbacks in PromiseJobs to complete
expect(order).to.eql(['B', 'A']); // SUCCESS: 'B' is first ONLY if promiseA waits for promiseB
});
});
methodA
和
methodB
都返回
Promise
。
Promise
返回的
methodA
称为
promiseA
,将
Promise
返回的
methodB
称为
promiseB
。
promiseA
是否等待解析直到promiseB
解析。
promiseA
不等待
promiseB
。
promiseA
是否不等待promiseB
promiseA
不等待
promiseB
)的一种简单方法是模拟
methodB
以返回
从未解决的
Promise
:
describe('methodA', () => {
beforeEach(() => {
// stub methodB to return a Promise that never resolves
stub(testObject, 'methodB').returns(new Promise(() => {}));
});
afterEach(() => {
testObject.methodB.restore();
});
it('should NOT await methodB', async () => {
// passes if promiseA did NOT wait for promiseB
// times out and fails if promiseA waits for promiseB
await testObject.methodA();
});
});
promiseA
确实是await
promiseB
,则此测试会使超时。
Promise
解析后,其
then
回调将添加到PromiseJobs队列中,并且当当前消息完成时,PromiseJobs中的所有作业将按顺序运行,直到队列为空。
async
和
await
只是
syntactic sugar over promises and generators。在
await
上调用
Promise
本质上将其余函数包装在PromiseJobs中计划的回调中,等待的
Promise
解析后再进行调度。
promiseA
DID是否等待
promiseB
而不超时。
promiseA
和
promiseB
都必须解析。
promiseA
是否正在等待
promiseB
,因为它们都在解析。
it('should result in [1, 2]', async () => {
const order = [];
const promise1 = Promise.resolve().then(() => order.push('1'));
const promise2 = Promise.resolve().then(() => order.push('2'));
expect(order).to.eql([]); // SUCCESS: callbacks are still queued in PromiseJobs
await Promise.all([promise1, promise2]); // let the callbacks run
expect(order).to.eql(['1', '2']); // SUCCESS
});
Promise.resolve()
返回已解析的
Promise
,因此这两个回调将立即添加到PromiseJobs队列中。暂停当前消息(测试)以等待PromiseJobs中的作业后,它们将按照添加到PromiseJobs队列中的顺序运行,并且当测试在
await Promise.all
之后继续运行时,
order
数组将按预期包含
['1', '2']
。
it('should result in [2, 1]', async () => {
const order = [];
let savedResolve;
const promise1 = new Promise((resolve) => {
savedResolve = resolve; // save resolve so we can call it later
}).then(() => order.push('1'));
const promise2 = Promise.resolve().then(() => order.push('2'));
expect(order).to.eql([]); // SUCCESS
savedResolve(); // NOW resolve the first Promise
await Promise.all([promise1, promise2]); // let the callbacks run
expect(order).to.eql(['2', '1']); // SUCCESS
});
resolve
中保存
Promise
,以便稍后使用。由于第一个
Promise
尚未解析,因此
then
回调不会立即添加到PromiseJobs队列中。另一方面,第二个
Promise
已经解决,因此其
then
回调已添加到PromiseJobs队列中。一旦发生这种情况,我们将调用保存的
resolve
,以便解析第一个
Promise
,这会将其
then
回调添加到PromiseJobs队列的末尾。一旦当前消息(测试)暂停以等待PromiseJobs中的作业,
order
数组将按预期包含
['2', '1']
。
What is the smart way to test if
await
was used in the function call?
await
的明智方法是向
then
和
promiseA
都添加
promiseB
回调,然后
延迟解析promiseB
。如果
promiseA
等待
promiseB
,则其回调将
始终是PromiseJobs队列中的最后。另一方面,如果
promiseA
不等待
promiseB
,则其回调将在PromiseJobs中首先在队列中排队。
methodA
是调用
async
上的
await
的
methodB
函数时,以及当
methodA
是返回链接到
async
返回的
Promise
的
Promise
的普通(非
methodB
)函数时,这种方法都有效(这是期望的,因为同样,
async / await
只是
Promises
和生成器上的语法糖。
关于javascript - JavaScript/Mocha-如何测试是否已等待函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54998608/
我获得了一些源代码示例,我想测试一些功能。不幸的是,我在执行程序时遇到问题: 11:41:31 [linqus@ottsrvafq1 example]$ javac -g test/test.jav
我想测试ggplot生成的两个图是否相同。一种选择是在绘图对象上使用all.equal,但我宁愿进行更艰巨的测试以确保它们相同,这似乎是identical()为我提供的东西。 但是,当我测试使用相同d
我确实使用 JUnit5 执行我的 Maven 测试,其中所有测试类都有 @ExtendWith({ProcessExtension.class}) 注释。如果是这种情况,此扩展必须根据特殊逻辑使测试
在开始使用 Node.js 开发有用的东西之前,您的流程是什么?您是否在 VowJS、Expresso 上创建测试?你使用 Selenium 测试吗?什么时候? 我有兴趣获得一个很好的工作流程来开发我
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 3 年前。 基于示例here ,我尝试为我的
我正在考虑测试一些 Vue.js 组件,作为 Laravel 应用程序的一部分。所以,我有一个在 Blade 模板中使用并生成 GET 的组件。在 mounted 期间请求生命周期钩子(Hook)。假
考虑以下程序: #include struct Test { int a; }; int main() { Test t=Test(); std::cout<
我目前的立场是:如果我使用 web 测试(在我的例子中可能是通过 VS.NET'08 测试工具和 WatiN)以及代码覆盖率和广泛的数据来彻底测试我的 ASP.NET 应用程序,我应该不需要编写单独的
我正在使用 C#、.NET 4.7 我有 3 个字符串,即。 [test.1, test.10, test.2] 我需要对它们进行排序以获得: test.1 test.2 test.10 我可能会得到
我有一个 ID 为“rv_list”的 RecyclerView。单击任何 RecyclerView 项目时,每个项目内都有一个可见的 id 为“star”的 View 。 我想用 expresso
我正在使用 Jest 和模拟器测试 Firebase 函数,尽管这些测试可能来自竞争条件。所谓 flakey,我的意思是有时它们会通过,有时不会,即使在同一台机器上也是如此。 测试和函数是用 Type
我在测试我与 typeahead.js ( https://github.com/angular-ui/bootstrap/blob/master/src/typeahead/typeahead.js
我正在尝试使用 Teamcity 自动运行测试,但似乎当代理编译项目时,它没有正确完成,因为当我运行运行测试之类的命令时,我收到以下错误: fatal error: 'Pushwoosh/PushNo
这是我第一次玩 cucumber ,还创建了一个测试和 API 的套件。我的问题是在测试 API 时是否需要运行它? 例如我脑子里有这个, 启动 express 服务器作为后台任务 然后当它启动时(我
我有我的主要应用程序项目,然后是我的测试的第二个项目。将所有类型的测试存储在该测试项目中是一种好的做法,还是应该将一些测试驻留在主应用程序项目中? 我应该在我的主项目中保留 POJO JUnit(测试
我正在努力弄清楚如何实现这个计数。模型是用户、测试、等级 用户 has_many 测试,测试 has_many 成绩。 每个等级都有一个计算分数(strong_pass、pass、fail、stron
我正在尝试测试一些涉及 OkHttp3 的下载代码,但不幸失败了。目标:测试 下载图像文件并验证其是否有效。平台:安卓。此代码可在生产环境中运行,但测试代码没有任何意义。 产品代码 class Fil
当我想为 iOS 运行 UI 测试时,我收到以下消息: SetUp : System.Exception : Unable to determine simulator version for X 堆
我正在使用 Firebase Remote Config 在 iOS 上设置 A/B 测试。 一切都已设置完毕,我正在 iOS 应用程序中读取服务器端默认值。 但是在多个模拟器上尝试,它们都读取了默认
[已编辑]:我已经用 promise 方式更改了我的代码。 我正在写 React with this starter 由 facebook 创建,我是测试方面的新手。 现在我有一个关于图像的组件,它有
我是一名优秀的程序员,十分优秀!