Javascript 如何在量角器承诺链中将,expect()与非量角器承诺混合?
我试图理解如何(以什么顺序)在量角器中执行承诺,特别是对于与量角器承诺混合在一起的非量角器承诺(ex.native或q承诺)。 我正在调试和修复一些工作中的脆弱量角器测试,我完全不是一个JavaScript程序员;所以,当给出你的答案时,假设你的答案会越过我的大脑,并将其降低一两级 在经历了几天的失败后,我决定写一些非常简单的例子来理解承诺链是如何执行的。 从我在网上读到的内容来看,我认为链接是这样的:Javascript 如何在量角器承诺链中将,expect()与非量角器承诺混合?,javascript,typescript,jasmine,protractor,Javascript,Typescript,Jasmine,Protractor,我试图理解如何(以什么顺序)在量角器中执行承诺,特别是对于与量角器承诺混合在一起的非量角器承诺(ex.native或q承诺)。 我正在调试和修复一些工作中的脆弱量角器测试,我完全不是一个JavaScript程序员;所以,当给出你的答案时,假设你的答案会越过我的大脑,并将其降低一两级 在经历了几天的失败后,我决定写一些非常简单的例子来理解承诺链是如何执行的。 从我在网上读到的内容来看,我认为链接是这样的: a().then(() => { x(); b().then(() =
a().then(() => {
x();
b().then(() => {
y();
c().then(() => z());
});
});
应与以下内容相同:
a().then(() => {
x();
b();
}).then(() => {
y();
c();
}).then(() => z());
这也应该与此相同(如果我在工作中使用ES6,我不会):
您可以在这里看到我的完整代码以及我得到的输出:
对于所有这些场景,以及使用本机承诺和量角器承诺时,我得到了不同的结果。
在second_spec.ts中,我还尝试在应该失败的承诺中添加expect()语句,我希望链接在expect()之后的承诺不会执行,因为expect应该抛出断言错误,但我看到的是,它执行之后的所有承诺都会执行,但由于expect()失败,测试仍然失败。非常奇怪…你的一个问题包含许多子问题,但都很好。所以最好一个接一个地讲,我会尽力解释,这可能会帮助你解决你的问题 第一个规格ts
it('promise chain 1', function () {
/* Prints the following:
[TRACE] default - Start
[DEBUG] default - Sleeping for 100 ms...
[TRACE] default - End
[INFO] default - --1
[DEBUG] default - Sleeping for 200 ms...
[INFO] default - --2
[DEBUG] default - Sleeping for 300 ms...
[INFO] default - --3
[INFO] default - --done
*/
logger.trace("Start");
printLater("--1", 100).then(() => {
printLater("--2", 200).then(() => {
printLater("--3", 300).thenFinally(() => {
logger.info("--done");
});
});
});
logger.trace("End");
});
- 这个很直截了当。printLater返回promise browser.sleep,因此它必须等待给定的时间,然后才能解析。这意味着每一个printLater都必须在进入下一个之前完成。我希望您对这个It块没有疑问 it('承诺链1.1',功能(){ /*打印以下内容: [跟踪]默认-启动 [调试]默认-睡眠100毫秒。。。 [跟踪]默认-结束 [信息]默认值----1 */ logger.trace(“启动”)
function nativePromise(msg, time) {
return new Promise((resolve) => {
resolve(printLater(msg, time));
});
}
注意:解决/拒绝承诺始终是最佳实践。
it('await promise 3.1', async function () {
/* Prints the following:
[TRACE] default - Start
[DEBUG] default - Sleeping for 100 ms...
[INFO] default - --1
*/
await logger.trace("Start");
await nativePromise("--1", 100);
await nativePromise("--2", 200); // Gets stuck after "--1"
await nativePromise("--3", 300);
await logger.info("--done");
await logger.trace("End");
});
对于前面的代码段,原因与我前面提到的相同。wait也会等待承诺来解决/拒绝。如果它不返回任何内容,那么wait也会在某一点上卡住
我们使用wait使代码更干净。在内部,它还等待承诺解析/拒绝,并且不返回承诺对象。wait从承诺对象中获取值并返回
注1:expect from Jasmine在执行任何进一步的操作之前会等待控件流为空
注2:实际上是webdriver的量角器Promise。Promise在量角器和WebDriverJ中不推荐使用。因此,如果可能的话,请不要使用它们。感谢@nitin sahu的快速回复!没错,我忘记添加resolve/reject调用。另外,我忘了添加对量角器提供给它的done()方法的调用()。添加这些修复后,代码工作得更好(请参阅我的git repo中的commit#5),但我仍然不明白为什么second_spec.ts中的expect()调用没有立即停止测试-我仍然看到expect()之后的print语句。同样在first_spec.ts中,为什么测试1.1的一些输出会溢出到测试1.2中,而2.1会溢出到测试2.2中?好的,我修复了commit 6中的所有承诺测试。我认为Javascript隐式返回函数中的最后一条语句,但看起来我必须为then()中的所有承诺显式添加返回语句它仍然不会在遇到失败的expect()语句时立即停止测试,但不幸的是,Jasmine就是这样工作的?
function nativePromise(msg, time) {
return new Promise((resolve) => {
resolve(printLater(msg, time));
});
}
it('await promise 3.1', async function () {
/* Prints the following:
[TRACE] default - Start
[DEBUG] default - Sleeping for 100 ms...
[INFO] default - --1
*/
await logger.trace("Start");
await nativePromise("--1", 100);
await nativePromise("--2", 200); // Gets stuck after "--1"
await nativePromise("--3", 300);
await logger.info("--done");
await logger.trace("End");
});