柴的断言,期待和应该有什么区别?

时间:2014-01-28 03:56:38

标签: javascript mocha chai

assertexpectshould之间有什么区别,以及何时使用?

assert.equal(3, '3', '== coerces values to strings');

var foo = 'bar';

expect(foo).to.equal('bar');

foo.should.equal('bar');

2 个答案:

答案 0 :(得分:268)

差异为documented there

这三个接口呈现不同类型的执行断言。最终,他们执行相同的任务。有些用户比另一种更喜欢一种风格。话虽如此,还有一些值得强调的技术考虑因素:

  1. assert和expect接口不会修改Object.prototype,而应该这样做。因此,在您不能或不想更改Object.prototype的环境中,它们是更好的选择。

  2. assert和expect接口支持几乎无处不在的自定义消息。例如:

    assert.isTrue(foo, "foo should be true");
    expect(foo, "foo should be true").to.be.true;
    

    如果断言失败,则消息“foo应为true”将与失败的断言一起输出。您没有机会使用should接口设置自定义消息。

  3. (历史记录:很长一段时间,这个答案声明要使用expect获取自定义消息,您必须使用解决方法。Aurélien Ribon通知我将消息传递给{{ 1}}作为第二个参数工作。因此,不需要解决方法。我无法找到哪个版本的Mocha开始提供对此消息的支持,也无法找到哪个版本的文档第一次记录下来。)

    请注意,expectassert.isTrue(foo)expect(foo).to.be.true如果您不使用自定义消息,则会输出以下内容:foo.should.be.true

    foo === 1

    因此,虽然期望和界面对于读取更好,但是当断言失败时,并不像一个界面比另一个界面更自然地提供信息。此消息对于所有三个接口都是相同的,并不会告诉您您正在测试的是什么,只是您获得的值是 AssertionError: expected 1 to be true ,但您想要1。如果你想知道你在测试什么,你需要添加一条消息。

答案 1 :(得分:6)

我希望这个简单的例子可以使它们之间的区别清楚

声明

var assert = require('chai').assert
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };

assert.typeOf(foo, 'string'); // without optional message
assert.typeOf(foo, 'string', 'foo is a string'); // with optional message
assert.equal(foo, 'bar', 'foo equal `bar`');
assert.lengthOf(foo, 3, 'foo`s value has a length of 3');
assert.lengthOf(beverages.tea, 3, 'beverages has 3 types of tea');

在所有情况下,断言样式都允许您在断言语句中包括一个可选消息作为最后一个参数。如果您的声明未通过,这些消息将包含在错误消息中。

注意 期望并且应该使用可链接的语言来构造断言,但是它们在初始构造断言的方式上有所不同。在应有的情况下,还有一些警告和克服这些警告的其他工具。

期望

var expect = require('chai').expect
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };
expect(foo).to.be.a('string');
expect(foo).to.equal('bar');
expect(foo).to.have.lengthOf(3);
expect(beverages).to.have.property('tea').with.lengthOf(3);

期望使您可以包含任意消息,以添加到可能发生的任何失败的断言之前。

var answer = 43;

// AssertionError: expected 43 to equal 42.
expect(answer).to.equal(42);

// AssertionError: topic [answer]: expected 43 to equal 42.
expect(answer, 'topic [answer]').to.equal(42);

与布尔值或数字之类的非描述性主题一起使用时,这非常方便。

应该

Should样式允许使用与Expect接口相同的可链接断言,但是它使用should属性扩展每个对象以启动链。与Internet Explorer一起使用时,此样式存在一些问题,因此请注意浏览器的兼容性。

var should = require('chai').should() //actually call the function
, foo = 'bar'
, beverages = { tea: [ 'chai', 'matcha', 'oolong' ] };

foo.should.be.a('string');
foo.should.equal('bar');
foo.should.have.lengthOf(3);
beverages.should.have.property('tea').with.lengthOf(3);

期望和应该之间的差异

首先,请注意,require require只是对Expect函数的引用,而使用should require时,该函数正在执行。

var chai = require('chai')
, expect = chai.expect
, should = chai.should();

期望界面提供了作为链接语言断言的起点的功能。它适用于node.js和所有浏览器。

接口扩展了Object.prototype以提供单个getter作为您的语言断言的起点。它可以在node.js和除Internet Explorer之外的所有现代浏览器中使用。