柴的“断言”、“期望”和“应该”有什么区别?
和 之间有什么区别?什么时候用什么?assert
expect
should
assert.equal(3, '3', '== coerces values to strings');
var foo = 'bar';
expect(foo).to.equal('bar');
foo.should.equal('bar');
和 之间有什么区别?什么时候用什么?assert
expect
should
assert.equal(3, '3', '== coerces values to strings');
var foo = 'bar';
expect(foo).to.equal('bar');
foo.should.equal('bar');
差异记录在那里。
这三个接口提供了执行断言的不同样式。最终,它们执行相同的任务。有些用户更喜欢一种样式而不是另一种样式。话虽如此,还有一些技术考虑因素值得强调:
和 接口不修改 ,而修改则修改。因此,在您无法或不想更改的环境中,它们是更好的选择。assert
expect
Object.prototype
should
Object.prototype
和 接口几乎在任何地方都支持自定义消息。例如:assert
expect
assert.isTrue(foo, "foo should be true");
expect(foo, "foo should be true").to.be.true;
如果断言失败,消息“foo 应为 true”将与失败的断言一起输出。您没有机会使用界面设置自定义消息。should
(历史说明:很长一段时间以来,这个答案都说要获得带有 的自定义消息,您必须使用解决方法。Aurélien Ribon告诉我,将消息传递给第二个参数是有效的。因此,不需要解决方法。我无法找到哪个版本的Mocha开始为此消息提供支持,也无法找到第一次记录它的文档版本。expect
expect
请注意,如果您不使用自定义消息,则所有 输出以下内容,并且:assert.isTrue(foo)
expect(foo).to.be.true
foo.should.be.true
foo === 1
AssertionError: expected 1 to be true
因此,虽然 and 接口更易于阅读,但当断言失败时,一个接口并不像另一个接口比另一个接口更自然地提供信息。此消息对于所有三个接口都是相同的,它不会告诉您究竟在测试什么,只是告诉您获得的值是但您想要的 。如果你想知道你正在测试什么,你需要添加一条消息。expect
should
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');
在所有情况下,断言样式都允许您在断言语句中包含可选消息作为最后一个参数。如果您的断言未通过,这些将包含在错误消息中。
注意并使用可链接的语言来构造断言,但它们在断言的初始构造方式上有所不同。在 的情况下,也有一些警告和额外的工具来克服警告。expect
should
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 属性扩展每个对象以启动链。此样式在与 Internet Explorer 一起使用时存在一些问题,因此请注意浏览器兼容性。should
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);
预期和应该之间的差异
首先,请注意,require 只是对函数的引用,而对于 require,函数正在执行。expect
expect
should
var chai = require('chai')
const expect = chai.expect
const should = chai.should();
预期的接口提供了一个函数,作为链接语言断言的起点。它适用于node.js和所有浏览器。
should 接口扩展了 Object.prototype,以提供单个 getter 作为语言断言的起点。它适用于node.js以及除Internet Explorer之外的所有现代浏览器。