【问题标题】:Testing the handling of a custom event in Jasmine测试 Jasmine 中自定义事件的处理
【发布时间】:2013-06-23 19:18:42
【问题描述】:

我想确保在触发自定义 jQuery 事件时,对象的方法作为事件处理程序被调用;但单元测试似乎返回了一个假阴性,因为我的实现运行良好。

(这是使用 Twitter FlightFlight Jasmine extensions 的测试套件的一部分,但这只是一个普通的 Jasmine 间谍。)

describe('listening for uiNeedsPlan event', function() {

var spy;
beforeEach(function() {
  spy = spyOn(this.component, 'getPlan');
  $(document).trigger('uiNeedsPlan');
});

it('gets the current plan', function() {
  expect(spy).toHaveBeenCalled();
});

});

这导致规范失败:

Expected spy getPlan to have been called.

这是我的 Flight 组件的代码实现中的一个 sn-p(成功运行):

this.after('initialize', function () {
  this.on(document, 'uiNeedsPlan', this.getPlan);
});

【问题讨论】:

  • 您是否检查过您的this.after... 回调是否已使用debuggerconsole.log 调用。顺便提一句。监视您要测试的对象的功能不是一个好主意。

标签: javascript unit-testing jasmine twitter-flight


【解决方案1】:

在详细说明为什么这不起作用之前,我首先要指出的是,测试此方法是否已执行是一种不好的做法。您应该测试组件的接口——它的输入和输出以及它对 DOM 的影响。它如何做它所做的事情(它调用了哪些内部方法,它的内部状态)是无关紧要的。

至于为什么它不起作用:当您创建间谍时,您正在监视组件方法的未绑定版本。当组件被实例化时,方法被绑定到实例并分配给回调。组件实例化后,无法访问这些绑定方法(afaik)。

相反,您需要在组件实例附加到 DOM 之前监视原型。另外,您似乎根本没有调用 setupComponent,所以 this.component 无论如何都不存在。

var spy;

beforeEach(function () {
    spy = spyOn(this.Component, 'getPlan');
    setupComponent();
    $(document).trigger('uiNeedsPlan');
});
it('executes getPlan', function() {
    expect(spy).toHaveBeenCalled();
});

【讨论】:

  • 谢谢汤姆!为什么不在单元测试中使用它的解释仍然让我有些困惑。我认为测试事件-> 事件更像是中途测试,而不是单元测试。但毫无疑问,你是对的 :D 这是我目前所拥有的;任何想法将不胜感激。 gist.github.com/joecritch/f6bbda18372a6c71393b
  • 重要的是事物的行为,而不是它的工作方式。例如:当我打开放大器的音量控制时,我感兴趣的是音量是否增加,而不是所有内部组件是否按特定顺序、命名特定事物或特定颜色。同样的测试适用于音量控制电路的任何实现,即使我从头开始重建放大器也不需要更改。
  • 基本上,通过测试内部结构,您正在为自己工作。如果你要重构,你将不得不重新构建你所有的测试,而你的测试并不是测试唯一重要的事情——组件是否完成了它应该做的事情。如果您在编写组件之前编写测试真的很有帮助 - 这样您就可以专注于需要发生的事情,而不是它将如何发生。
  • @TomHamshere,单元测试将单独执行。当您说“组件是否按预期执行”时,您正在考虑 e2e 或集成测试,afaik。即使代码库的其余部分不存在,单元测试也应该在隔离单元上工作。
  • 我完全同意。我是说你应该测试组件的接口:输入和输出,而不是它内部执行的过程。这是测试某事做什么和它如何做之间的区别。将组件视为黑盒。这样,当您更改内部工作时,您不必更改您的测试。
猜你喜欢
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多