gpt4 book ai didi

jasmine - 如何监视一个内部有 Promise 且不返回结果但处理响应本身的函数?

转载 作者:行者123 更新时间:2023-12-02 20:18:51 24 4
gpt4 key购买 nike

如何监视对象中调用的方法?

// Game.js

export default {
mine: null,

handle: function(me) {
console.log(" FOOOOO " + me)
},

setSource: function() {
this.mine.getSource().then((response) => {
const {source} = response
this.handle(source)
})
}
}

在这里我尝试监视:

// GameSpec.js

import Game from '../../lib/jasmine_examples/Game'

Game.mine = {}

describe("Game", function() {
it("should set source and handle it", function() {

Game.mine.getSource = () => {
return new Promise((resolve)=>{
resolve( {
source : 'BAAAAR'
})
})
}

spyOn(Game, 'handle').and.callThrough()

Game.setSource()

expect(Game.handle).toHaveBeenCalled()
});
});

在输出中,您可以看到函数“handle”被调用:

Started
F FOOOOO BAAAAR


Failures:
1) Game should set source and handle it
Message:
Expected spy handle to have been called.
Stack:
Error: Expected spy handle to have been called.
at <Jasmine>
at UserContext.<anonymous> (/Users/silverbook/Sites/zTest/jasmine/spec/jasmine_examples/PlayerSpec.js:20:29)
at <Jasmine>

1 spec, 1 failure

但是jasmine说它没有被调用。

如果我删除模拟的Promise,测试就会通过,但我需要那里。在另一个测试中,我将在 Promise 中返回一个错误,并让它从另一个函数中处理。

所以 Promise 破坏了测试,但为什么呢?

最佳答案

测试同步执行,并且在 this.mine.getSource().then() 排队的回调有机会执行之前,expect 失败。

对于 Jasmine >= 2.7 和 async 函数支持,您可以将测试函数转换为 async 函数并添加 await Promise.resolve(); 您想要暂停同步测试并让任何排队的回调执行的位置。

对于您的测试,它看起来像这样:

import Game from '../../lib/jasmine_examples/Game'

Game.mine = {}

describe("Game", function() {
it("should set source and handle it", async () => {

Game.mine.getSource = () => {
return new Promise((resolve)=>{
resolve( {
source : 'BAAAAR'
})
})
}
spyOn(Game, 'handle').and.callThrough();

Game.setSource();

await Promise.resolve(); // let the event loop cycle

expect(Game.handle).toHaveBeenCalled();
});
});

对于较旧的 (>= 2.0) Jasmine 版本,您可以使用 done(),如下所示:

import Game from '../../lib/jasmine_examples/Game'

Game.mine = {}

describe("Game", function() {
it("should set source and handle it", (done) => {

Game.mine.getSource = () => {
return new Promise((resolve)=>{
resolve( {
source : 'BAAAAR'
})
})
}
spyOn(Game, 'handle').and.callThrough();

Game.setSource();

Promise.resolve().then(() => {
expect(Game.handle).toHaveBeenCalled();
done();
});

});
});

关于jasmine - 如何监视一个内部有 Promise 且不返回结果但处理响应本身的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51848131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com