Chai 的 to.have 被使用发生 "TypeError" 问题的处理方式

在前端开发过程中,测试是非常重要的一部分。其中,Chai 是一个可以用来编写可读性高的测试代码的 JavaScript 断言库。通过使用它提供的“to.have”等方法,可以轻松地进行测试断言,但在实际使用过程中,也会遇到一些问题,比如 "TypeError" 错误。

"TypeError" 错误介绍

在 JavaScript 开发中,当某个变量或属性被使用时,其类型不符合预期时,就会产生 "TypeError" 错误。这个错误信息通常会提供一些相关的信息,如出错的位置、可能是由于什么原因导致的等等。

在使用 Chai 的 to.have 方法时,也会遇到这种类型的错误。具体来说,当我们使用 to.have.been.called 或 to.have.been.calledOnce 时,如果对错误的对象使用这个方法,则会收到一个 "TypeError" 错误。

例如下面的代码:

const chai = require('chai');
const sinon = require('sinon');
const sinonChai = require('sinon-chai');

chai.use(sinonChai);

describe('Chai to.have TypeError issue', () => {
  it('should throw a TypeError', () => {
    const foo = sinon.spy();
    chai.expect(foo.bar).to.have.been.calledOnce;
  });
});

运行这段代码,会得到以下报错:

解决 "TypeError" 错误的方法

出现这种错误,我们需要对 "to.have" 方法的使用进行检查,找出错误原因并进行修复。具体而言,我们可以从以下两个方面入手:

对所测试的对象进行判断

在进行 to.have 方法测试之前,我们需要先对对象进行判断,确保其存在。比如,我们可以使用断言库 Chai 的 expect 和 assert 方法,对对象进行期望值的判断。如果对象存在,则可以进一步使用 to.have 方法进行测试。

以前面的例子为例,可以进行以下修改:

const chai = require('chai');
const sinon = require('sinon');
const sinonChai = require('sinon-chai');

chai.use(sinonChai);

describe('Chai to.have TypeError issue', () => {
  it('should not throw a TypeError', () => {
    const foo = sinon.spy();
    chai.expect(foo).to.exist;
    chai.expect(foo.bar).to.have.been.calledOnce;
  });
});

这样,如果 foo 没有实现 bar 方法,会得到一个“TypeError: Cannot read property 'calledOnce' of undefined”的错误;如果 foo 不存在,则会得到一个“AssertionError: expected undefined to exist”的错误。

不使用 "to.have.been.called" 方法

如果无法对被测试对象进行判断,我们还可以尝试不使用"to.have.been.called"方法。例如,我们直接使用 sinon 的 spy 特性,对对象进行测试。以下是一个例子:

const chai = require('chai');
const sinon = require('sinon');
const sinonChai = require('sinon-chai');

chai.use(sinonChai);

describe('Chai to.have TypeError issue', () => {
  it('should not throw a TypeError', () => {
    const foo = sinon.spy();
    foo();
    chai.expect(foo.calledOnce).to.equal(true);
  });
});

这种方法虽然不够简洁,但能够避免使用 "to.have" 方法产生的 "TypeError" 错误。

总结

在 Chai 中,to.have 方法是一种非常方便的测试方法,但是也容易产生 TypeError 错误。在遇到这种错误时,我们应该对对象进行判断,或者尝试使用别的方法进行测试。避免这种错误的发生,让我们的测试代码更加有效。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/659236fceb4cecbf2d7171c6


纠错
反馈