101

基于教程使用 chai 测试 angularjs 应用程序,我想使用“应该”样式添加一个未定义值的测试。这失败了:

it ('cannot play outside the board', function() {
  scope.play(10).should.be.undefined;
});

出现错误“TypeError: Cannot read property 'should' of undefined”,但测试以“expect”样式通过:

it ('cannot play outside the board', function() {
  chai.expect(scope.play(10)).to.be.undefined;
});

我怎样才能让它与“应该”一起工作?

4

9 回答 9

85

这是 should 语法的缺点之一。它通过将 should 属性添加到所有对象来工作,但如果返回值或变量值未定义,则没有对象来保存该属性。

文档提供了一些解决方法,例如:

var should = require('chai').should();
db.get(1234, function (err, doc) {
  should.not.exist(err);
  should.exist(doc);
  doc.should.be.an('object');
});
于 2013-10-06T21:27:10.110 回答
61
should.equal(testedValue, undefined);

如 chai 文档中所述

于 2014-05-20T11:59:50.977 回答
19
(typeof scope.play(10)).should.equal('undefined');
于 2014-06-23T03:43:19.903 回答
18

测试未定义

var should = require('should');
...
should(scope.play(10)).be.undefined;

测试是否为空

var should = require('should');
...
should(scope.play(10)).be.null;

测试虚假,即在条件下被视为虚假

var should = require('should');
...
should(scope.play(10)).not.be.ok;
于 2015-06-02T12:51:04.163 回答
10

我努力为未定义的测试编写 should 语句。以下不起作用。

target.should.be.undefined();

我找到了以下解决方案。

(target === undefined).should.be.true()

if 也可以写成类型检查

(typeof target).should.be.equal('undefined');

不确定上述方法是否正确,但它确实有效。

根据 github 上 ghost 的帖子

于 2016-06-08T23:51:31.043 回答
5

尝试这个:

it ('cannot play outside the board', function() {
   expect(scope.play(10)).to.be.undefined; // undefined
   expect(scope.play(10)).to.not.be.undefined; // or not
});
于 2013-10-06T13:26:51.423 回答
3

不要忘记havenot关键字的组合:

const chai = require('chai');
chai.should();
// ...
userData.should.not.have.property('passwordHash');
于 2017-11-30T17:34:49.853 回答
1

根据文档,@david-norman 的答案是正确的,我在设置方面遇到了一些问题,而是选择了以下。

(typeof scope.play(10)).should.be.undefined;

于 2014-09-04T09:32:53.597 回答
0

您可以将函数结果包装在should()并测试“未定义”类型:

it ('cannot play outside the board', function() {
  should(scope.play(10)).be.type('undefined');
});
于 2014-02-20T21:46:36.420 回答