【发布时间】:2018-04-22 16:02:24
【问题描述】:
我已经尝试调试了好几天,但无法弄清楚问题出在哪里。本来以为是订单依赖,现在不这么认为了,所以rspec --bisect=verbose.
我现在倾向于 Devise/Warden 助手无法正常工作,我没有正确设置 capybara/web 驱动程序或其他原因。
此测试有时会失败:
- 在重定向时,从菜单中选择项目以重定向到另一个页面时。比如
redirects to Account Settings page after pressing Account Settings。这就是我责怪 Devise 助手的地方,因为我在登陆主页时已登录,但当我进入帐户设置时current_user返回nil,因此示例失败,因为它被重定向到登录页面。李>
这也是特定于测试的实时代码,几个月来都没有问题。
系统测试
require 'rails_helper'
RSpec.describe 'home page', type: :system do
before(:context) do
WebMock.disable_net_connect!(allow_localhost: true)
end
after(:each) do
Warden.test_reset!
end
context 'when not logged in' do
it 'displays login with discord button' do
visit '/'
expect(page).to have_content 'Login with Discord'
end
it 'logs in with discord after clicking Login with Discord' do
OmniAuth.config.test_mode = true
visit '/'
click_on 'Login with Discord'
expect(page).to_not have_content 'Login with Discord'
find('.profile-menu').hover
expect(page).to have_content 'Account Settings'
expect(page).to have_content 'Event Calendar'
expect(page).to have_content 'Logout'
end
end
context 'when logged in' do
context 'as an average user' do
before do
@user = build(:user, confirmed_at: Time.now)
create(:profile, user: @user)
login_as(@user, scope: :user)
end
it 'shows profile menu' do
visit '/'
find('.profile-menu').hover
expect(page).to have_content 'Account Settings'
expect(page).to have_content 'Event Calendar'
expect(page).to have_content 'Logout'
end
it 'logs user out after pressing Logout' do
visit '/'
find('.profile-menu').hover
find('.logout').click
expect(page).to have_content 'Login with Discord'
end
it 'redirects to Events page after pressing Event Calendar' do
event = create(:event)
visit '/'
find('.profile-menu').hover
find('.event-calendar').click
expect(page).to have_content event.title
end
it 'redirects to Account Settings page after pressing Account Settings' do
visit '/'
find('.profile-menu').hover
find('.settings').click
expect(page).to have_content 'Account Settings'
end
end
context 'as an organiser' do
before do
@user = build(:user, confirmed_at: Time.now, role: :organiser)
create(:profile, user: @user)
login_as(@user, scope: :user)
end
it 'shows profile menu with Organiser Dashboard link' do
visit '/'
find('.profile-menu').hover
expect(page).to have_content 'Organiser Dashboard'
end
it 'redirects to Organiser Dashboard page after pressing Organiser Dashboard' do
visit '/'
find('.profile-menu').hover
find('.organiser-dashboard').click
expect(page).to have_content 'Create Event'
end
end
end
end
设计配置
require 'devise'
RSpec.configure do |config|
config.include Warden::Test::Helpers
end
Javascript 驱动菜单重定向
handleCommand(command) {
if (command === "logout") {
Rails.ajax({
url: "/sign_out",
type: "DELETE",
dataType: "json",
success: (signed_in_status) => {
this.$store.commit('authenticate', false)
this.$message.success('You logged out');
location.href = "/";
},
error: (signed_in_status) => {
this.$store.commit('authenticate', true)
this.$message.error('Something went wrong');
}
})
}
else if (command === "settings") {
location.href = "/users/edit";
}
else if (command === "events") {
location.href = "/events";
}
else if (command === "organiser") {
location.href = "/admin/events";
}
}
【问题讨论】:
-
@TarynEast 我尝试只运行一项测试,看看我是否可以访问帐户设置。没有前/后块,只需设置 Webmock 和用户登录。我也没有做
Warden.test_reset!。测试失败 1/4 次 -
@MaximFedotov 没什么特别的,只是环顾四周看看是否有任何配置设置跳出来,在每个步骤之间添加睡眠以查看是否提高了可靠性等。事实上它只是有时会失败很奇怪,因为“帐户设置”测试中的任何内容都不应真正取决于时间,除非您懒惰加载 JS 行为或在 JS 中使用会话 cookie
-
@TarynEast 我认为等待不会影响重定向。由于动画与水豚点击有关,我实际上已经开始在不同的测试中使用等待。但我打算在测试中一起禁用动画以避免不得不这样做。但我不觉得等待会帮助重定向丢失
current_user -
@MaximFedotov 第一个请求将始终有效,因为
login_as短路了 1 个请求的登录并直接设置登录的用户对象。这就是为什么我问@user是否真的被保存了,因为在第二个请求中,它必须根据第一个响应期间设置的会话 cookie 进行真正的查找。问题是您说故障是间歇性的,这往往表明存在时间问题。您是否真的尝试在每一步之间睡几秒钟,看看它是否使测试可靠? (你说你不认为它会影响,但你真的尝试过吗?) -
@MaximFedotov 另外,每个人都说他们“使用了默认设置”,但事实证明他们已经关闭了事务,实际上并没有让 Capybara 运行 AUT,或者正在做一些自定义会话管理,等等,等等。这就是为什么我问它是否可以公开访问,因为它通常更容易浏览整个测试配置,而不是试图将人们报告的配置拼凑在一起。如果您可以整理一个显示行为的最小示例,它将使这变得更容易(并且可能会引导您找到原因)。
标签: javascript ruby-on-rails rspec devise capybara