chai.assert()在断言之前不会在测试中运行方法(chai断言lib与量角器)

时间:2015-05-21 10:06:52

标签: protractor assert chai e2e-testing

我第一次在SO上发布一个问题,我希望我做得对。

it (' :: 2.0 service creation :: should fill out service info tab', function(){
    createNewService.setServiceName(e2eConfig.newServiceDetails.basicServiceName);
    createNewService.selectCategory();
    createNewService.setIntroText(e2eConfig.newServiceDetails.introText);
    createNewService.selectParent();
    createNewService.uploadIcon();
    createNewService.nextTab();
    //right now assert will fire off without running the methods above because
    //we are still on the infoTab
    assert(($(createNewService.selectors.infoTab).isDisplayed()) == true, 'did not move to the next tab');
},20000);

此测试的作用是填充输入,在必要时选择下拉菜单并上传文件。

然后,测试尝试切换到小部件中的下一个选项卡。

要确定它是否设法切换到下一个标签,我想使用自定义消息进行chai库断言。

  • 使用当前代码,assert将返回true,因为它看到infoTab并且测试将失败而不在断言之前运行任何方法

  • 如果我更改断言行以查找'!== true',那么它将运行方法并继续

在任何情况下,以不同方式执行此操作或使用expect而不是assert会更好吗?

Chai assert API

Chai expect API

1 个答案:

答案 0 :(得分:1)

所有Protractor函数调用都会返回异步解析的promises,因此如果您在createNewService上定义的函数都调用了Protractor函数,那么在调用assert之前,您必须等待它们解析。尝试以下内容:

it (' :: 2.0 service creation :: should fill out service info tab', function(done) {
  createNewService.setServiceName(e2eConfig.newServiceDetails.basicServiceName);
  createNewService.selectCategory();
  createNewService.setIntroText(e2eConfig.newServiceDetails.introText);
  createNewService.selectParent();
  createNewService.uploadIcon();
  createNewService.nextTab().then(function() {
    assert.eventually.strictEqual($(createNewService.selectors.infoTab).isDisplayed(), true, 'did not move to the next tab');
    done();
  });
},20000);

有几点需要注意:

  • 此示例假定createNewService.nextTab()返回一个承诺。
  • 您需要使用像chai-as-promised这样的库来处理对promises返回的值的断言。在你的代码中你要声明一个promise对象== true,这是因为强制而真实的。
  • 由于您的函数是异步运行的,因此您需要将回调函数传递给匿名函数,然后在测试完成后调用它。可以找到有关测试异步代码的信息here