2015-04-30 7 views
3

Я работаю с Rails 4, RSpec, Capybara и селеном. Я столкнулся с странностью, которую, похоже, не могу решить, пробовав в последний день или около того. У меня довольно простая спецификация запроса, потому что тест не регистрирует изменение модели. Вот моя спецификация:Rails 4 Rspec ожидать {}. Изменить регистрацию, несмотря на то, что тест работает как запланировано.

describe "manage pages", :js => true do 
    before :each do 
     @fake_page = FactoryGirl.create(:page_with_block, name: "Foobar") 
     @fake_page2 = FactoryGirl.create(:page_with_block, name: "sdfdf") 
     visit admin_pages_path 
     save_page 
    end 

    it "should delete an image when link is clicked" do 
     expect { 
      within "#page_#{@fake_page.id}" do 
       click_link 'Destroy' 
      end 
      wait = Selenium::WebDriver::Wait.new ignore: Selenium::WebDriver::Error::NoAlertPresentError 
      alert = wait.until { page.driver.browser.switch_to.alert } 
      alert.accept 
     }.to change(Page, :count).by(-1) 
     expect(page).to have_content "Listing Pages" 
     expect(page).not_to have_content "Foobar" 
     save_page   
    end 
end 

Как вы можете видеть, это основной щелчок по уничтожению и подтверждение теста js alert. Проблема заключается в том, что он всегда терпит неудачу:

......F 

Failures: 

    1) Pages manage pages should delete an image when link is clicked 
    Failure/Error: expect { 
     expected #count to have changed by -1, but was changed by 0 
    # ./spec/requests/admin/pages_spec.rb:116:in `block (3 levels) in <top (required)>' 

Finished in 11.74 seconds (files took 3.81 seconds to load) 
7 examples, 1 failure 

По save_page файлов я вложил мне раньше, и один в конце теста, когда я закомментируйте «изменение expect.to», все работает по назначению, поддельные страницы создаются в предыдущем, тест проходит и щелкает, уничтожает и принимает предупреждение, страница уничтожается, а индексная страница перезагружается без нее на контенте. То, что я не понимаю, - это то, почему помощник Change не видит, что он, по сути, работает.

Я прочитал, что это, возможно, придется делать с моим файлом rails_helper.rb, но все, что я посмотрел не похожая, если не точная, установка:

ActiveRecord::Migration.maintain_test_schema! 

RSpec.configure do |config| 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 

    config.use_transactional_fixtures = false 

    config.infer_spec_type_from_file_location! 

    config.include Capybara::DSL 

    config.before(:suite) do 
     DatabaseCleaner.strategy = :truncation 
     DatabaseCleaner.clean_with(:truncation) 
    end 
    config.before(:each) do 
     DatabaseCleaner.strategy = :transaction 
    end 
    config.before(:each, :js => true) do 
     DatabaseCleaner.strategy = :truncation 
    end 
    config.before(:each) do 
     DatabaseCleaner.start 
    end 
    config.after(:each) do 
     DatabaseCleaner.clean 
    end 

    config.after(:suite) do 
     FileUtils.rm_rf(Dir["#{Rails.root}/public/test/system/"]) 
    end 


end 

Так как я могу найти другого появления этого на Google или этом сайте, я должен просто делать что-то не так. Может ли кто-нибудь указать мне на недостаток в моем коде? Заранее спасибо.

+0

Это то же самое происходит со мной постоянно. По большей части я прибегал (по возможности) к проверке через пользовательский интерфейс самого приложения, чтобы узнать, были ли созданы или уничтожены какие-либо соответствующие записи (-ы), а затем избавиться от этого утверждения. Но есть места, где то, что создано/уничтожено, практически не доступно из пользовательского интерфейса через тест. Вы поняли это случайно? Если это так, я хотел бы узнать решение. – tobogranyte

ответ

1

Я борюсь с той же проблемой. Вы ожидаете, что логика может иметь недостатки. Я использовал this approach, и это сработало для меня.

Copypasted из этой статьи - в основном вам нужно создать помощника:

# spec/support/wait_for_ajax.rb 
module WaitForAjax 
    def wait_for_ajax 
    Timeout.timeout(Capybara.default_max_wait_time) do 
     loop until finished_all_ajax_requests? 
    end 
    end 

    def finished_all_ajax_requests? 
    page.evaluate_script('jQuery.active').zero? 
    end 
end 

RSpec.configure do |config| 
    config.include WaitForAjax, type: :feature 
end 

Включить все файлы поддержки автоматически в вашем spec_helper.rb

spec/support/**/*.rb in our spec_helper.rb 

или сделать это вручную, как я:

#rails_helper.rb 
require_relative 'support/wait_for_ajax' 

Теперь мой тест проходит!

require 'rails_helper' 

RSpec.feature "Call Me Back contact front feature spec >", :type => :feature, js: true do 
feature 'valid form' do 
    scenario "with name and phone" do 
    visit '/' 
    execute_script '$("#call-popup").fadeIn(300)' 

    fill_in 'call_me_back_request_name', with: 'Clark Kent' 
    fill_in 'call_me_back_request_phone', with: '1234445566' 

    within '#new_call_me_back_request' do 
     expect{ 
     find("input[type='submit']").click 
     wait_for_ajax #<- the magic is here! 
     }.to change(Request, :count).by(1) 
    end 
    end 
end