我们正在编写一个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后解决页面上的内容。
答案 0 :(得分:0)
今天早上我花了一些时间在IRC上,并且如果建议我告诉控制器不重定向,如果来自Ember.Select
的选择是null
。这解决了重定向问题,但打破了选择器 - 第一次尝试选择值导致没有变化;之后它运作正常。
我将select移动到扩展Ember.Select
的自定义视图中,并将更改操作放在那里。然后我使用路由器在控制器上填充属性的初始值,一切似乎都有效。
所以 - 教训:
1)在自定义视图上放置更改事件;没有控制器直接观察。
2)当控制器正在观察属性的变化时,请确保存在初始值。对于由数据库提供的值,这可能是唯一的。