“才”中的“断言”、“期望”和“应该”有什么区别?

assertexpectshould之间的区别是什么? 什么时候使用?

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

var foo = 'bar';
    

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

foo.should.equal('bar');
72487 次浏览

区别在于 记录在案

这三个接口表示执行断言的不同样式。最终,他们执行相同的任务。有些用户更喜欢其中一种风格。尽管如此,还有一些技术上的考虑值得强调:

  1. assertexpect接口不修改 Object.prototype,而 should修改 Object.prototype。因此,在您不能或不想更改 Object.prototype的环境中,它们是更好的选择。

  2. assertexpect接口几乎在任何地方都支持自定义消息。例如:

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

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

(历史记录: 很长一段时间以来,这个答案都说明,要使用 expect获得自定义消息,必须使用变通方法。Aurélien Ribon告诉我,将消息作为第二个参数传递给 expect是可行的。因此,没有必要使用变通方法。我无法找到哪个版本的 Mocha 开始为这条消息提供支持,也无法找到哪个版本的文档首次对其进行了记录。)

请注意,如果不使用自定义消息,assert.isTrue(foo)expect(foo).to.be.truefoo.should.be.true都会输出以下内容,而 foo === 1:

    AssertionError: expected 1 to be true

因此,虽然 expectshould接口对 更好,但是当断言失败时,这两个接口并不像一个接口那样比另一个接口更自然地提供信息。这条消息对于所有三个接口都是相同的,它没有准确地告诉您正在测试的 什么,只是告诉您得到的值是 1,但是您需要 true。如果您想知道您在测试什么,您需要添加一条消息。

我希望这个简单的例子能够说明他们之间的差异

坚持

var assert = require('chai').assert
const foo = 'bar'
const 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');

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

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

期待

var expect = require('chai').expect
const foo = 'bar'
const 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);

expect允许您包含任意消息以预防可能发生的任何失败断言。

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样式允许与期望接口相同的可链接断言,但是它使用一个 should 属性扩展每个对象以启动链。这种风格在使用 Internet Explorer 时会有一些问题,所以要注意浏览器的兼容性。

var should = require('chai').should() //actually call the function
const foo = 'bar'
const 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);

期望与应该的区别

首先,请注意,expect要求只是对 expect函数的引用,而对于 should要求,函数正在执行。

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

期待接口提供了一个函数作为链接语言断言的起点。它适用于 node.js 和所有浏览器。

应该接口扩展 Object.model,以提供一个 getter 作为语言断言的起点。它适用于 node.js 和除 Internet Explorer 之外的所有现代浏览器。

如果我说错了请纠正我,但是在代码运行行为方面,断言和期望之间也有很大的区别。 断言应该在出错时停止程序。 期待不是。