如何在我的测试中断言 Chai 断言将失败(Error 与 AssertionError)
how to assert in my tests that a Chai assertion will fail (Error vs. AssertionError)
我对 Error
和 AssertionError
的继承关系以及它如何与 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';
…无声地失败并且AssertionError
是undefined
加上以下成功的事实:
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 }
的事情。拉取请求正在处理中。
我对 Error
和 AssertionError
的继承关系以及它如何与 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';
…无声地失败并且AssertionError
是undefined
加上以下成功的事实:
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 }
的事情。拉取请求正在处理中。