在node.js中断言值

时间:2014-09-09 14:24:48

标签: javascript node.js assert

我有一个功能,

Edit1 - 使用real更新了函数,因为前一个函数是简化的同步函数,代码在@AlexMA中正确指出了

'returnSuccessOrFailure': function () {
            return driver.findElement(wd.By.css('div#button')).then(function (button) {
                return button.getAttribute('class').then(function (status) {
                    return status;
                });
            });
        }

在我的node.js测试中,我的断言失败,因为在returnSuccessOrFailure完成执行之前调用了断言。

var value = returnSuccessOrFailure();
assert.equal(value,'success', 'Looks like something failed');

如果我在returnSuccessOrFailure中实现一个承诺并链接我的断言,那么这是有效的。我的问题是,我是否必须始终为这种情况实施承诺来阻止执行?我是Javascript的新手,以及它的异步性以及何时使用promises以及何时不会有用的任何见解。

4 个答案:

答案 0 :(得分:2)

你不必“实现承诺”,只需返回你已经拥有的承诺:

returnSuccessOrFailure': function () {
            return driver.findElement(wd.By.css('div#button')).then(function (button) {
                ...

但是,是的,你仍然需要将你的断言放在done处理程序

returnSuccessOrFailure().done(function(value) {
  assert.equal(value,'success', 'Looks like something failed');
}

答案 1 :(得分:1)

链接你的断言不仅会使它工作,而且还会使代码更具可读性。在返回重构时,了解以什么顺序发生的事情会很有用。不仅如此,回调/承诺的结构也允许轻松编写定时器测试。 此外,由于您的测试需要具有当前的执行状态,因此很可能无论如何都需要在回调中编写带有断言的测试。

答案 2 :(得分:1)

  

我的问题是我是否必须始终为这种情况实施承诺来阻止执行?

请注意,promises不会阻止执行。他们推迟执行依赖于结果的代码,注意你是still chaining callbacks

  

我是Javascript的新手,以及它的异步性质以及何时使用promises以及何时不会有用的任何见解。

只要有一些可能异步运行并需要传回异步结果的代码,

Promise就很有用。否则你需要使用回调,这比承诺更丑陋。

答案 3 :(得分:1)

这是 code contracts 的一部分,代表前提条件(执行前保留的内容),后置条件(在您之后持有什么)执行)和对象不变量(什么不能改变)。 JavaScript没有本机支持,但您可以使用第三方库(Cerny.jsecmaDebugjsContractjscategory

我认为这取决于您的编码风格,是 EAFP (更容易请求宽恕而不是许可)或 LBYL (在您跳跃之前看)。两者都可行!在大多数编译语言中,您将使用 LBYL 。但是在Python中,您可以使用 EAFP

一般来说如果您知道自己会失败,那么您希望 fail fast 。如果您想使用断言来确保代码快速失败,则由您决定。