问题 Chai等断言库如何在不强制调用函数的情况下工作?


,你可以做以下的事情:

expect({}).to.exist;

exist 不是函数调用,但这仍然适用于测试框架。相反(expect({}).to.not.exist)导致测试失败,但同样, exist 不是函数调用。

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


7148
2017-07-17 23:12


起源



答案:


我想通了(至少,我想通了 一个 方法)。使用 JavaScript getter

var throws = {
  get a() {
    throw new Error('a');
  },
  get b() {
    throw new Error('b');
  },
  get c() {
    throw new Error('c');
  }
};

做的时候 throws.athrows.b, 要么 throws.c,将抛出相应的错误。

从那时起,构建Chai中包含的断言相当容易。


11
2017-07-18 03:06



这是怎么解释的?这是一个非常大的跳跃,但没有解释中间发生的事情 - vsync
如果您不熟悉getter,链接的文章确实有助于解释事情。简短的版本是,由于新的( - )浏览器改进,你现在可以控制一个属性,而不仅仅是设置它(例如。 a.b = 5)。现在,您可以为属性定义“getter”方法,并在任何代码尝试读取该属性的值时(例如, console.log(a.b))浏览器将运行定义的“getter”方法。然后该方法可以触发逻辑(例如,Chai的断言逻辑)。所以,当你做一个 to.exist,即使没有 () 在你之后 是 仍在调用方法(getter方法)。 - machineghost


答案:


我想通了(至少,我想通了 一个 方法)。使用 JavaScript getter

var throws = {
  get a() {
    throw new Error('a');
  },
  get b() {
    throw new Error('b');
  },
  get c() {
    throw new Error('c');
  }
};

做的时候 throws.athrows.b, 要么 throws.c,将抛出相应的错误。

从那时起,构建Chai中包含的断言相当容易。


11
2017-07-18 03:06



这是怎么解释的?这是一个非常大的跳跃,但没有解释中间发生的事情 - vsync
如果您不熟悉getter,链接的文章确实有助于解释事情。简短的版本是,由于新的( - )浏览器改进,你现在可以控制一个属性,而不仅仅是设置它(例如。 a.b = 5)。现在,您可以为属性定义“getter”方法,并在任何代码尝试读取该属性的值时(例如, console.log(a.b))浏览器将运行定义的“getter”方法。然后该方法可以触发逻辑(例如,Chai的断言逻辑)。所以,当你做一个 to.exist,即使没有 () 在你之后 是 仍在调用方法(getter方法)。 - machineghost