【发布时间】:2012-01-09 05:17:08
【问题描述】:
我正在为一些 Javascript 类(backbone.js 视图,用 Coffeescript 编写)编写规范,我想确保一个视图构建另一个视图。
我试图通过监视构造函数来做到这一点,如下所示:
describe 'Avia.AviaView', ->
beforeEach ->
@aviaView = new Avia.AviaView()
@matricesView = new Backbone.View()
spyOn(Avia.MatricesView, 'constructor').andReturn @matricesView
describe 'initialize', ->
beforeEach ->
@aviaView.initialize()
it 'creates a new MatricesView ', ->
expect(Avia.MatricesView.constructor).toHaveBeenCalledOnce()
对 AviaView 的 initialize() 调用肯定会导致 MatricesView 构造函数被调用,礼貌这一行:
new Avia.MatricesView($("#tabs-3")).initialize()
它确实有效;如果我手动运行应用程序,我可以看到在initialize() 期间调用了构造函数。但是我的 Jasmine 规格失败了:
Running Jasmine specs...
F
Avia.AviaView initialize creates a new MatricesView . (/Users/dev/avia/spec/javascripts/views/avia_view_spec.js.coffee:13)
Expected constructor to be called exactly once, but was called '0' times (line ~14)
expect(Avia.MatricesView.constructor).toHaveBeenCalledOnce();
FAIL: 1 test, 1 failure, 0.008 secs.
我已经和我的几位同事谈过了,他们都同意这应该工作......谁能建议一种监视构造函数的好方法?
【问题讨论】:
-
乍一看,这似乎与范围界定有关。第二个 beforeEach 函数如何访问 [at]aviaView 的第一个实例?尝试将 beforeEach -> 更改为 beforeEach => 以便保留父范围。也尝试在 [at]aviaView 之前定义 [at]aviaView 视图。 CoffeeScript 不像 Ruby,其中 [at] 自动将其设为实例变量。所以不允许我输入 at 符号。
-
谢谢 - 我尝试将所有内容移至同一范围,但问题仍然存在。我很确定问题是在监视构造函数时我“做错了”......但我不知道正确的方法是。
标签: ruby-on-rails-3.1 coffeescript jasmine