gpt4 book ai didi

ruby-on-rails - Rails 密码重置测试在单独运行时通过但在运行整个测试套件时失败

转载 作者:行者123 更新时间:2023-12-04 19:25:45 24 4
gpt4 key购买 nike

我正在测试使用 Clearance 身份验证 gem 的密码重置流程,但我无法弄清楚如何为此编写测试,该测试在我运行整个测试套件时通过。当我单独运行它时测试通过但当我运行整个测试套件时失败给我这个错误消息:

Capybara::ExpectationNotMet: expected "/users/467591525/password/edit?token=8fd60112cf461061eb405632f35e08a3830f661c" to equal "/users/467591525/password/edit"

我首先尝试将其作为系统测试进行,这是我进行所有其他类似测试的地方。那个在 test/system/user_password_reset_test.rb它继承自 ApplicationSystemTestCaseclass UserPasswordResetTest < ApplicationSystemTestCase .

但是当我单独运行该测试作为系统测试时,我收到相同的错误消息。

如果我使用 class PasswordResetTest < ActionDispatch::IntegrationTest 将其切换到集成测试单独运行时测试通过但失败并返回 Capybara::ExpectationNotMet运行整个测试套件时出错。

这是完整的测试:
require 'application_system_test_case'

class PasswordResetTest < ActionDispatch::IntegrationTest

def setup
clear_emails
@user = users(:lee)
end

test 'User can reset their password' do
perform_enqueued_jobs do
visit sign_in_path
assert_current_path sign_in_path
click_link 'Forgot Password'
assert_current_path new_password_path
assert_title 'Password reset | Flagship'
assert_selector 'h1', text: 'Reset your password'
fill_in('Email', with: @user.email)
click_button 'Reset password'
assert_current_path passwords_path
assert_selector 'h1', text: 'Your password reset email is on the way.'
end
sleep 10
open_email(@user.email)
current_email.click_link 'Change my password'
assert_current_path(edit_user_password_path(@user, token: @user.confirmation_token))
assert_title 'Change your password | Flagship'
assert_selector 'h1', text: 'Change your password'
fill_in('Choose password', with: 'New_Password')
click_button 'Save this password'
assert_current_path(dashboard_path)
end
end

我已经有一段时间无法解决这个问题了,无法弄清楚我做错了什么。这是我的 test/application_system_test_case.rb :

需要'test_helper'
# System tests
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
driven_by :selenium, using: :chrome, screen_size: [1400, 1400]

include SignInHelper
end

还有我的 test/test_helper.rb :
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
require 'rails/test_help'
require 'minitest/reporters'
Minitest::Reporters.use!

# Helpers used in tests
module SignInHelper
def sign_in_as_user_without_account
@user_without_account = users(:user_without_account)
visit root_path(as: @user_without_account)
end

def sign_in_as_account_owner
@account_owner = users(:lee)
visit root_path(as: @account_owner)
end
end

# Model tests
class ActiveSupport::TestCase
parallelize(workers: :number_of_processors)

fixtures :all
end


class ActionDispatch::IntegrationTest
# Controllers
require 'capybara/rails'
require 'capybara/minitest'
include Capybara::DSL
include SignInHelper

# Mailers
include ActiveJob::TestHelper
include Capybara::Email::DSL

end

我在那里配置了错误吗?

更新

正如托马斯的回答建议添加 ignore_query: true固定测试下降的线。所以我改了 assert_current_path(edit_user_password_path(@user, token: @user.confirmation_token))assert_current_path(edit_user_password_path(@user), ignore_query: true)但是现在测试在下一步中失败了。

似乎当 capybara 点击电子邮件中的链接时,它不会使用允许用户创建新密码的 token 转到正确的页面。相反,它返回密码重置页面,并显示 Clearance flash 消息: failure_when_forbidden: Please double check the URL or try submitting the form again. .

因此,似乎 Capybara 点击链接并没有通过重置 token 进入正确的页面。但奇怪的是,这在单独运行时会通过,然后每次运行整个测试套件时都会失败。

这是测试失败的屏幕截图:
enter image description here

最佳答案

这应该仍然是一个系统测试。之后很可能一旦用户点击编辑密码路由, token 就会被重置,以便它只能使用一次。这可能会使您的比较失败。但是,您确实不需要确认 token 是路由的一部分,因为如果 token 验证失败,您将无法进入编辑密码页面,其余的测试也会失败。因此而不是

assert_current_path(edit_user_password_path(@user, token: @user.confirmation_token))

你可以做
assert_current_path(edit_user_password_path(@user), ignore_query: true)

关于ruby-on-rails - Rails 密码重置测试在单独运行时通过但在运行整个测试套件时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57814385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com