由水豚测试引发的灰烬过渡

时间:2013-10-05 02:36:00

标签: selenium ember.js capybara capybara-webkit

我们正在编写一个Ember.js应用程序,并且在一个页面上有一个Ember.Select,其选择是来自Rails数据库的模型。 select上的值绑定到控制器上的观察者,该观察器根据选择更改视图。这在使用浏览器时可正常工作;但是,当在Capybara中运行集成测试时(使用webkit和selenium驱动程序),当没有选择时,控制器上的观察者会在此选择上注册更改操作。这会触发转换并导致测试失败。

简化版的代码如下:

Ember.Select

<div class="select-dropdown">
  {{view Prm.PropertySelect
  contentBinding='properties'
  optionLabelPath='content.name'
  optionValuePath='content.id'
  selectionBinding='selectedProperty'
  id='property-selector'
  classNames='property-selector'}}
</div>

Ember.Controller操作

Prm.PropertyController = Ember.ObjectController.extend
  selectedLead: null
  selectedProperty: null

  selectedPropertyChanged: (->
    @transitionToRoute('property.index', @get('selectedProperty'))
  ).observes('selectedProperty')

水豚规格

require 'spec_helper'

feature 'ember allows direct access to a lead via url', js: true do
  scenario 'linking directly to lead' do
    user = create_signed_in_user
    lead = create_lead_for_user(user)

    visit ember_lead_path(lead) # defined in a helper. Returns url as string.
    assert_at_lead_detail(lead)
  end

  def assert_at_lead_detail(lead)
    expect(page).to have_link 'All leads'
    expect(page).to have_text lead.booking_request.name.upcase
  end
end

如果我移除了观察者,则测试通过。如果我不删除观察者,测试将转到相应的URL,然后重定向到root,测试失败。

我需要一种方法来重写测试或选择,以便我们可以编写集成测试,在直接导航到Ember中的URL后解决页面上的内容。

1 个答案:

答案 0 :(得分:0)

今天早上我花了一些时间在IRC上,并且如果建议我告诉控制器重定向,如果来自Ember.Select的选择是null。这解决了重定向问题,但打破了选择器 - 第一次尝试选择值导致没有变化;之后它运作正常。

我将select移动到扩展Ember.Select的自定义视图中,并将更改操作放在那里。然后我使用路由器在控制器上填充属性的初始值,一切似乎都有效。

所以 - 教训:

1)在自定义视图上放置更改事件;没有控制器直接观察。

2)当控制器正在观察属性的变化时,请确保存在初始值。对于由数据库提供的值,这可能是唯一的。