在app中我使用gem" I18n"国际化。所有问题都可以,但在接受测试中,我收到一个错误:
Failure/Error: expect(current_path).to eq profile_path
expected: "/profile"
got: "/en/profile"
(compared using ==)
测试:
describe 'User go to profile' do
before do
page.driver.header 'Accept-Language', locale
I18n.locale = locale
sign_in (user)
end
context 'locale EN' do
let(:locale) { :en }
scenario 'and view see profile page' do
visit profile_path
expect(current_path).to eq profile_path
end
end
end
现场所有工作都很好。我该如何解决?
答案 0 :(得分:0)
当使用具有JS功能的驱动程序(capybara-webkit)时,Capybara操作会异步发生。这意味着访问调用可能会在浏览器的URL实际更改之前返回,以及为什么大多数水豚操作都内置了等待行为。在这种情况下,它可能是您在浏览器从旧路径更改为新路径之前获取current_path。有几种解决方案
如果使用Capybara 2.5+更改为使用内置等待行为的have_current_path匹配器
期望(页面).to have_current_path(profile_path)
为页面上应该添加的内容添加内容检查 - 将触发等待行为并确保在获取current_path之前加载页面
在访问后添加一两秒的睡眠,这将使浏览器有时间更改为新路径
显然#1是更好的解决方案,除非你有某些理由不能使用Capybara 2.5 +
答案 1 :(得分:0)
由于您说这些问题仅在RSpec测试中且应用程序正常运行,因此我假设您希望这些网址采用/:locale/profile(.:format)
的形式。所以,如果您的应用程序中有类似以下路由范围的内容......
<强>配置/ routes.rb中强>
scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do
get 'profile', to: 'users#profile'
# other routes
end
...你的控制器中有以下内容(可能是ApplicationController
)会自动将locale
注入到网址选项...
def url_options
{ locale: I18n.locale }.merge(super)
end
(以上也可以覆盖default_url_options
作为Tom Walpole mentioned)
...然后,您还需要将locale
作为参数传递给规范中的路径:
describe 'User go to profile' do
before do
page.driver.header 'Accept-Language', locale
I18n.locale = locale
sign_in (user)
end
context 'locale EN' do
let(:locale) { :en }
scenario 'and view see profile page' do
visit profile_path
expect(current_path).to eq profile_path(locale: locale)
end
end
end
假设上述情况正确,您甚至可以在rails控制台中测试它,并且(可能)获得类似于以下内容的输出:
irb> app.profile_path
ActionController::UrlGenerationError: No route matches {:action=>"profile", :controller=>"users"} missing required keys: [:locale]
irb> app.profile_path(locale: :en)
"/en/profile"