Javascript 像Chai这样的断言库如何在不强制调用函数的情况下工作?

Javascript 像Chai这样的断言库如何在不强制调用函数的情况下工作?,javascript,function,assert,assertions,chai,Javascript,Function,Assert,Assertions,Chai,在中,您可以执行以下操作: expect({}).to.exist; exist不是函数调用,但在测试框架中仍然有效。相反的(expect({}).to.not.exist)会导致测试失败,但同样地,exist不是函数调用 在不让我调用函数的情况下,这些断言如何工作?事实上,如果我尝试说expect({}).to.exist()测试失败,因为exist不是一个函数。我找到了它(或者至少找到了一个方法)。使用: 执行抛出.a、抛出.b或抛出.c时,将抛出相应的错误 从这一点来看,构建包含在Cha

在中,您可以执行以下操作:

expect({}).to.exist;
exist
不是函数调用,但在测试框架中仍然有效。相反的(
expect({}).to.not.exist
)会导致测试失败,但同样地,
exist
不是函数调用

在不让我调用函数的情况下,这些断言如何工作?事实上,如果我尝试说
expect({}).to.exist()
测试失败,因为
exist
不是一个函数。

我找到了它(或者至少找到了一个方法)。使用:

执行
抛出.a
抛出.b
抛出.c
时,将抛出相应的错误


从这一点来看,构建包含在Chai中的断言相当容易。

这是如何解释的?这是一个相当大的飞跃,没有解释中间发生了什么。如果你不熟悉getters,链接文章真的可以帮助你解释事情。简短的版本是,由于新的(-ish)浏览器改进,您现在可以控制一个属性,而不仅仅是设置它(例如
a.b=5
)。现在,您可以为属性定义“getter”方法,当任何代码尝试读取该属性的值时(例如
console.log(a.b)
),浏览器将运行定义的“getter”方法。然后,该方法可以触发逻辑(例如Chai的断言逻辑)。因此,当您对.exist执行
操作时,即使在您仍然调用一个方法(getter方法)之后没有
()
var throws = {
  get a() {
    throw new Error('a');
  },
  get b() {
    throw new Error('b');
  },
  get c() {
    throw new Error('c');
  }
};