Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript chai expect函数是如何工作的?_Javascript_Mocha.js_Chai - Fatal编程技术网

Javascript chai expect函数是如何工作的?

Javascript chai expect函数是如何工作的?,javascript,mocha.js,chai,Javascript,Mocha.js,Chai,从chai的api中,您可以得到如下代码: .exist Asserts that the target is neither null nor undefined. var foo = 'hi' , bar = null , baz; expect(foo).to.exist; expect(bar).to.not.exist; expect(baz).to.not.exist; 这部分是如何工作的?expect函数返回一个对象,然后对“to”对象进行简单的属性查找。这只是一个

从chai的api中,您可以得到如下代码:

.exist

Asserts that the target is neither null nor undefined.

var foo = 'hi'
  , bar = null
  , baz;

expect(foo).to.exist;
expect(bar).to.not.exist;
expect(baz).to.not.exist;
这部分是如何工作的?expect函数返回一个对象,然后对“to”对象进行简单的属性查找。这只是一个财产评估,不是吗?唯一对我有意义的是如果exist属性是getter方法


怎么办?

chai公开了一个
使用
方法来访问
chai
导出及其
utils

此方法可由第三方使用,但也可在内部用于加载其接口

此方法的实现非常简单:

exports.use = function (fn) {
  if (!~used.indexOf(fn)) {
    fn(this, util);
    used.push(fn);
  }

  return this;
};
在内部,它使用它加载(除其他外)主要的断言原型和核心断言功能:

var assertion = require('./chai/assertion'); // primary Assertion prototype
exports.use(assertion); // load it

var core = require('./chai/core/assertions'); // core assertion functionality
exports.use(core); // load it
// load expect interface
var expect = require('./chai/interface/expect'); // expect interface
exports.use(expect); // load it

// expect interface
module.exports = function (chai, util) {
  chai.expect = function (val, message) {
    return new chai.Assertion(val, message); // return new Assertion Object with all functionality
  };
};
断言原型
公开的方法之一是
addProperty
方法,该方法允许您向所述
原型
添加属性

  Assertion.addProperty('exist', function () {
    this.assert(
        null != flag(this, 'object')
      , 'expected #{this} to exist'
      , 'expected #{this} to not exist'
    );
  });
内部
chai
使用此方法将核心断言功能添加到
断言原型
。例如,所有语言链和断言帮助程序(
存在
,等等)都是以这种方式添加的

语言链:

[ 'to', 'be', 'been'
  , 'is', 'and', 'has', 'have'
  , 'with', 'that', 'which', 'at'
  , 'of', 'same' ].forEach(function (chain) {
    Assertion.addProperty(chain, function () {
      return this;
    });
  });
当特定接口在内部加载时,所有这些功能都可用,例如
expect
。加载此接口时,只要执行
expect
,就会实例化一个新的
断言原型
,该原型将包含所有功能:

var assertion = require('./chai/assertion'); // primary Assertion prototype
exports.use(assertion); // load it

var core = require('./chai/core/assertions'); // core assertion functionality
exports.use(core); // load it
// load expect interface
var expect = require('./chai/interface/expect'); // expect interface
exports.use(expect); // load it

// expect interface
module.exports = function (chai, util) {
  chai.expect = function (val, message) {
    return new chai.Assertion(val, message); // return new Assertion Object with all functionality
  };
};
如您所见,
expect
方法接受一个
val
参数(以及一个可选的
message
参数)。调用此方法时(例如
expect(foo)
),将实例化并返回一个新的
断言原型
,公开所有核心功能(允许您执行
expect(foo).to.exist

断言构造函数
使用
标志
util
在映射到传入的
val
参数的对象上设置标志值

  function Assertion (obj, msg, stack) {
    flag(this, 'ssfi', stack || arguments.callee);
    flag(this, 'object', obj); // the 'object' flag maps to the passed in val
    flag(this, 'message', msg);
  }
所有
存在
所做的就是通过
标志
util
获取该值,并使用
断言原型
上定义的
断言
方法计算该值是否不等于
null

  Assertion.addProperty('exist', function () {
    this.assert(
        null != flag(this, 'object')
      , 'expected #{this} to exist'
      , 'expected #{this} to not exist'
    );
  });
调用
expect(foo)
时,将实例化一个新的断言对象

to、have、with和类似属性只返回该断言实例。它们只是为了可读性

然而,在您的示例中,exists实际上是运行断言的东西

这是一种财产。将属性添加到断言的方式是尽可能将它们定义为getter函数

expect(foo).to.exist
可以分解为:

const assertion = new Assertion;
assertion.exists;
assertion.exists
使用getter添加到断言对象。 这意味着在执行assertion.exists时,要计算assertion.exists的值,将执行先前提供给
addProperty
的函数


你可以阅读更多关于它的信息。

这是一个getter属性。是的,不太习惯使用它们。嗯,
chai
拥抱它们。您还没有看过
should
…但是如果测试失败,它如何停止expect调用执行后的剩余代码呢?例如,如果在
it
中稍后有
done()
回调,则不会执行该回调。。。