如何在我的测试中断言Chai断言将失败(Error vs. AssertionError)

时间:2017-09-27 21:16:49

标签: javascript node.js mocha chai

我对ErrorAssertionError的继承关系感到困惑,以及它如何与assert.throws一起使用。

在我的测试代码中,我有:

// @flow
...
import {assert} from 'chai';
import {AssertionError}  from 'assertion-error';

describe('foo', function() {
    it('boo', function() {
        assert.throws( ()=>{throw new Error()}
                       , AssertionError); //a 
        assert.throws( ()=>{throw new AssertionError()}
                       , Error);          // b
        assert.throws( ()=>{assert.isTrue(false);}
                       , Error);          // c
        assert.throws( ()=>{assert.isTrue(false);}
                       , AssertionError); // d
    });
});

上述assert.throws个语句的所有成功。我期待他们中的一些成功,一些失败。 具体来说,假设AssertionError将Error作为其原型,我希望a失败,因为需要更严格的类型(AssertionError)而不是抛出(Error)。相反,它与其他人一起成功了。是什么给了什么?

我使用的包是:

chai@4.1.2
mocha@3.5.3

更新

基于this answer我确认如果,而不是:

import {assert} from 'chai';
import {AssertionError}  from 'assertion-error';

......我这样做:

const assert = require('chai').assert;
const AssertionError = require('assertion-error');

......然后结果如预期。

3 个答案:

答案 0 :(得分:1)

我刚试过

const assert = require('chai').assert;
const AssertionError = require('assertion-error');

assert.throws(
    () => {
      throw new Error();
    },
    AssertionError
);

它按预期工作... wtf enter image description here

答案 1 :(得分:1)

所以我不是Babel用户,但是我安装了它并尝试使用提到的预设进行编译并得到了相同的错误,我记录了AssertionError并且没有导入(未定义)。

我将import语句更改为:

import {assert} from 'chai';
import AssertionError  from 'assertion-error';

它工作正常。

原因在于做 import {AssertionError} from ...实际上它正在查找包的导出属性'断言错误',基本上就像执行require('assertion-error').AssertionError一样,AssertionError类是断言错误包的默认导出。

虽然令人伤心的是,它无声地失败,但实际上,这是有道理的,因为babel将其转化为此,所以它永远不会检查该属性是否存在:

var _assertionError = require('assertion-error');

_chai.assert.throws(function () {
    throw new Error();
}, _assertionError.AssertionError);

此外,这是chai中的错误,好像第二个参数存在一样,即使它未定义,chai应该考虑它并抛出AssertionError。它应该做if (arguments.length === 2) { // consider the second argument } else { // do not consider it }之类的事情。拉请求正在进行中。

答案 2 :(得分:0)

声明:

import {AssertionError}  from 'assertion-error';

...无声地失败,AssertionErrorundefined

这一点,再加上以下成功:

    it('weird', function() {
        assert.throws(()=>{
            throw 1;
        }, undefined);
    });

......产生了观察到的情况。

我将导入更改为:

import AssertionError  from 'assertion-error';

......观察到的情况是预期的情况。