ember.js 在Ember 2.16中创建使用window.confirm()的集成测试?

0ve6wy6x  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(143)

我正在为一个Ember 2.16组件编写集成测试,并且正在测试一些用户操作。
其中一个使用者动作会呼叫window.confirm(),询问使用者是否确定要在删除项目之前删除项目。
我想测试此组件的功能,包括接受和拒绝确认。组件操作类似于:

delete(id){
  if(confirm('Are you sure you want to delete?')){
    //do stuff
  } else {
    //do other stuff
  }
}

在我的集成测试中,我成功地单击了按钮以显示提示符,但是我遇到了以下错误:
[Testem] Calling window.confirm() in tests is disabled, because it causes testem to fail with browser disconnect error.
如何创建一个将绕过window.confirm()功能的集成测试?
我已经在我的组件中添加了一种方法,用于在env处于“测试”模式时绕过确认,但这实际上没有帮助,因为我没有测试依赖于window.confirm()的代码部分。
我四处查看是否有可以传递给组件的变量,以使window.confirm()为true/false,但没有成功。
我如何创建一个测试来测试一个在操作中调用window.confirm()的组件?

axzmvihb

axzmvihb1#

一个解决方案是保存window.confirm的原始实现,并在测试之前编写自己的实现,然后在测试结束时恢复原始实现。
我会这样做:

// Watch out, this test is written with the latest ember-qunit syntax which might not be exactly what you have in your Ember 2.16 application
import { module, test } from 'qunit';
import { setupRenderingTest } from 'ember-qunit';
import { render } from 'ember-test-helpers';
import hbs from 'htmlbars-inline-precompile';

module('your component integration tests', function(hooks) {
  setupRenderingTest(hooks);

  test('clicking the OK confirm button', async function(assert) {
    // save the original window.confirm implementation
    const originalWindowConfirm = window.confirm;

    // simulate the OK button clicked
    window.confirm = function() { return true;}

    // ADD YOUR TEST AND ASSERTIONS HERE

    // restore the original window.confirm implementation
    window.confirm = originalWindowConfirm;
  });

});
6jjcrrmo

6jjcrrmo2#

我会在测试中使用像sinon这样的库来存根window.confirm(),我希望它被调用,这样:
1.希望不会出现错误消息
1.我知道confirm()实际上是由代码调用的,并且执行我希望它执行的操作(也就是说,我可以将它设置为一个简单的fn)
1.它可以被恢复,这样警告消息将被记录在其他测试中(这很有帮助)
根据测试代码,它覆盖window.confirm()以打印此警告消息:

window.confirm = function() {
  throw new Error('[Testem] Calling window.confirm() in tests is disabled, because it causes testem to fail with browser disconnect error.');
};

因此,在测试Sinon时做这样的事情应该是可行的:

const confirm = sinon.stub(window, "confirm").callsFake(() => {
  // fake implementation here which overwrites the testem implementation
});

// rest of the test

confirm.restore(); // restores the testem implementation

相关问题