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

how to assert in my tests that a Chai assertion will fail (Error vs. AssertionError)

我对 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 会失败,因为需要比抛出的类型 (Error) 更严格的类型 (AssertionError)。相反,它与其他人一起成功了。给出了什么?

我使用的包是:

chai@4.1.2
mocha@3.5.3

更新

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

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

…我愿意:

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

……那么结果也符合预期

我刚试过

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

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

而且它按预期工作了...wtf

声明:

import {AssertionError}  from 'assertion-error';

…无声地失败并且AssertionErrorundefined

加上以下成功的事实:

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

…产生了观察到的情况。

一旦我将导入更改为:

import AssertionError  from 'assertion-error';

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

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

我将导入语句更改为:

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

而且效果很好。

原因是通过做 import {AssertionError} from ... 它实际上是在寻找包 'assertion-error' 的导出 属性,基本上就像做 require('assertion-error').AssertionError,AssertionError class 是断言的默认导出-错误包。

虽然可悲的是,它无声地失败了,但实际上,这是有道理的,因为 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 } 的事情。拉取请求正在处理中。