gpt4 book ai didi

javascript - 使用 Jasmine async 测试 postMessage 不起作用

转载 作者:数据小太阳 更新时间:2023-10-29 04:14:43 25 4
gpt4 key购买 nike

我正在尝试使用 Jasmine 2.0 为 AngularJS 应用程序中的某些逻辑编写单元测试,但该逻辑位于事件监听器中。来自 Controller :

  window.addEventListener('message', function(e) {
if (e.data === "sendMessage()") {
$scope.submit();
}
}, false);

来自测试文件:

  describe("post message", function() {
beforeEach(function(done) {
var controller = createController(controllerParams);
spyOn($scope, 'submit');
window.postMessage('sendMessage()', '*');
done();
});

it('should submit on a sent message', function (done) {
expect($scope.submit).toHaveBeenCalled();
done();
});
});

但是测试失败了, spy 永远不会被击中。放入控制台调试语句的额外信息:

    正在调用 Controller 中的
  • window.addEventListener
  • beforeEachit block 都被调用。
  • Controller 中的上述消息处理程序在测试期间未被调用。
  • 此测试中发送的消息最终会被消息处理程序多次接收,但直到测试结束后才接收。

我的测试在这里缺少什么?

最佳答案

它的发生是因为在你的 beforeEach block 中你调用了 window.postMessage() (这是异步的,你不知道它什么时候会执行)然后你在它之后立即调用 done(),因为它是同步代码。但是 window.postMessage() 是异步的,基本上你需要在异步操作完成时调用 done()。可以这样做:

beforeEach(function(done) {  
spyOn(someObject, 'submit').and.callFake(function () {
done();
});
});

所以当你的 spy 执行时,异步操作就被认为完成了。

这可以表达得更短:

beforeEach(function(done) {  
spyOn(someObject, 'submit').and.callFake(done);
});

完整代码如下:

var someObject = {
submit: function () {
console.log('Submit');
}
};

window.addEventListener('message', function(e) {
if (e.data === "sendMessage()") {
someObject.submit();
}
}, false);

// Test

describe('window.postMessage', function () {

beforeEach(function(done) {
spyOn(someObject, 'submit').and.callFake(function () {
done();
});
window.postMessage('sendMessage()', '*');
});

it('should submit on a sent message', function () {
expect(someObject.submit).toHaveBeenCalled();
});

});

查看工作中的 JS Bin:http://jsbin.com/xikewogagu/1/edit?html,js,console,output

我没有在这个示例中使用 Angular,因为它可以用纯 JS 重现。

关于javascript - 使用 Jasmine async 测试 postMessage 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30788380/

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