2017-07-19 115 views
1

我在我的应用程序中使用数据表,并且记录由ajax加载到表中。现在我正在为我的数据表的页面编写测试,并且必须等待直到记录被加载。我配置了capybara webkit,并在我的测试中放入了js:true。但是当我运行测试我得到这个错误水豚webkit忽略ActionController :: RoutingError

Failure/Error: raise ActionController::RoutingError, "No route matches [#{env['REQUEST_METHOD']}] #{env['PATH_INFO'].inspect}" 

ActionController::RoutingError: 
     No route matches [GET] "/images/sort_both.png" 

在我的浏览器我检查了控制台,我没有得到这个错误,所有图像都发现。

这是我的WebKit的配置

Capybara.javascript_driver = :webkit 

Capybara::Webkit.configure do |config| 
    config.raise_javascript_errors = false 
end 

我使用wait_for_ajax方法

def wait_for_ajax 
    Timeout.timeout(Capybara.default_max_wait_time) do 
    loop do 
     active = page.evaluate_script('jQuery.active') 
     break if active == 0 
    end 
    end 
end 

,这是我的测试

scenario 'check pending contributions', js: true do 
    login_as analyst, scope: :analyst 

    visit '/analyst/contributions' 

    wait_for_ajax 
    expect(page).to have_content "#{contribution.user_name}" 
    end 

,现在我想解决这个路由错误,或者只是忽略它,因为我只是想测试逻辑,而不是js错误。

回答

0

该错误不是JS错误,这是您的服务器在请求资产时引发的错误。您可以通过设置Capybara.raise_server_errors = false来告诉您的测试忽略错误,但更好的解决方案是修复您的资产管道,以便在测试环境中正确提供所有资产。可能性是,您之前已经在测试环境中预编译了资产,并且剩余的清单文件正在阻止其重新编译新添加的资产。您可以通过运行这样

RAILS_ENV=test rake assets:clobber 

此外,假设#{contribution.user_name}文本正在通过Ajax调用加载没有必要为wait_for_ajax方法调用,因为have_content将已经等待/重试修复。

+0

感谢您的答案,它解决了我的问题的ActionController :: RoutingError,但我的测试它不工作。我的表没有被填充/ capybara没有在测试中等待,所以它没有找到“#{contribution.user_name}”。但是,谢谢你的精确答案。 –

+0

@MatheusMendes你的测试不工作是一个不同的问题,你可以尝试增加'Capybara.default_max_wait_time',以防止响应时间太长。更可能的是你没有创建要在测试中返回的记录(或者通过不做或者通过使用'let'来懒洋洋地创建'贡献',所以当你得到ajax结果时它实际上不在数据库中),或者您尚未禁用事务性测试并设置database_cleaner,因此记录在测试和应用程序线程中都可用。然而,这真的是一个单独的问题,从这一个 –

+0

感谢您的回应@ thomas,我测试,记录是使用pry创建的,我使用let!它在开始时创建记录。我所有的其他测试都在工作,所以我认为我的事务性测试database_cleaner是可以的。将更多的细节发布另一个问题,谢谢。 –

相关问题