Chai:如何使用“ should”语法测试未定义


95

教程中使用chai测试angularjs应用程序的基础上,我想使用“应该”样式为未定义的值添加测试。这将失败:

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

错误为“ TypeError:无法读取未定义的属性”应该”,但测试以“期望”样式通过:

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

我如何使其与“应该”一起使用?


1
如果您将使用“断言”,这很容易,您可以这样做assert.isUndefined(scope.play(10))
lukaserat

Answers:


80

这是应当语法的缺点之一。它通过向所有对象添加应有属性来工作,但是如果未定义返回值或变量值,则没有对象可容纳该属性。

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

var should = require('chai').should();
db.get(1234, function (err, doc) {
  should.not.exist(err);
  should.exist(doc);
  doc.should.be.an('object');
});

14
should.not.exist将验证该值是否null正确,因此此答案不正确。@daniel的答案如下:should.equal(testedValue, undefined);。那应该是公认的答案。
塞巴斯蒂安

7
我每月都会得到这个答案(不是🙈文档):-)
拉尔夫·考林

52
should.equal(testedValue, undefined);

如柴文档中所述


12
天哪,有什么要解释的?您期望testedValue为===未定义,以便对其进行测试。许多开发人员首先将testedValue放在首位,然后将其与应该链接,最终会出现错误……
丹尼尔(Daniel)2014年

5
这无法立即使用,在的API文档中也.equal()找不到。我能理解为什么@OurManInBananas要求解释。这是意外的使用should作为接受两个参数的函数,而不是预期的链接方法形式接受单个参数作为预期值。您只能通过导入/要求和分配一个调用版本来实现此目的,.should()如@DavidNorman接受的答案和本文档中所述
gfullam

我认为您会发现该.equal语法会产生更好的错误消息,因为它使您可以在出现故障时输出更具描述性的消息
jcollum 2016年

17

测试未定义

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;

并不是特别有用或直观,但这很聪明!
thebenedict 2015年

2
没有用?这是在bdd样式IMO中进行未定义测试的最佳答案,但是,它需要安装其他npm软件包(should软件包),我认为不应该为此安装其他软件包,但是,如此出色的答案
Wagner Leonardi


8

我很难为未定义的测试编写should语句。以下无效。

target.should.be.undefined();

我发现以下解决方案。

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

如果还可以将其写为类型检查

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

不知道上面的方法是否正确,但是确实可以。

根据来自github中ghost的Post


1
值得注意的是,使用此语法可能会导致JavaScript将括号括起来的表达式解释为试图将前一行作为函数调用(如果您不使用分号结尾的行)。
bmacnaughton

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
});

谢谢,但这就是我在上面第二次尝试中所做的。我想了解如何使用should语法。
thebenedict

1

@ david-norman的回答根据文档是正确的,我在设置时遇到了一些问题,因此选择了以下内容。

(typeof scope.play(10))。应该是未定义的;


typeof操作符返回一个字符串 ; 所以这个主张不能通过;的Cuz'undefined' !== undefined
dNitro

1

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

const chai = require('chai');
chai.should();
// ...
userData.should.not.have.property('passwordHash');

0

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

it ('cannot play outside the board', function() {
  should(scope.play(10)).be.type('undefined');
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.