2013-10-05 35 views
0

我們正在編寫一個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

我今天早上花了IRC一段時間,開到正確的道路時,有人建議我告訴控制器重定向如果從Ember.Select選擇是null。這解決了重定向問題,但打破了選擇器 - 第一次嘗試選擇一個值導致沒有改變;之後,它正常工作。

我將select移到了一個自定義視圖中,並將其更改爲Ember.Select並將更改操作置於此處。然後,我使用路由器在控制器上填充了屬性的初始值,並且一切似乎都起作用。

所以 - 教訓:

1)放在自定義視圖改變事件;沒有控制器直接觀察。

2)當控制器正在觀察屬性的變化時,確保有一個初始值。對於由數據庫提供的值來說,這可能是唯一的。