【发布时间】:2023-03-11 15:38:01
【问题描述】:
我创建了一个测试,以确认在对注册表单的发布请求失败后,当前 URL 与之前相同。在这种情况下,默认 RESTful 路由取代了自定义 url。我的测试通过了,但我认为不完整和/或有错误。
过程: 使用 form_for 方法创建带有注册表单的注册页面 (signup.html.erb):
..
<%= form_for(@user, url: signup_path) do |f| %>
..
为注册页面的获取和发布请求设置路由:
..
get '/signup', to: 'users#new'
post '/signup', to: 'users#create'
resources :users
..
用户控制器的操作:
..
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
redirect_to @user
else
render 'new'
end
end
..
测试断言当前的url(在提交无效数据的post请求之后)是否等于post请求之前的url,这是路由中设置的自定义路径。
..
test "should keep signup page after failed post request" do
post signup_path, params:{ user: { name: "", email: "user@invalid", password: "123",
password_confirmation: "321" }
}
assert_equal request.fullpath, signup_path
end
..
正如我所写,测试通过了。 问题是,当 form_for(signup.html.erb 文件)中的路径为空时,它仍然会通过。
在最后一种情况下,在失败的 POST 尝试之后,注册页面的 url 不再是 /signup,在我的情况下,它现在是默认的 RESTful 路由 /用户。
问题: 有谁知道为什么在尝试发布失败后 request.fullpath 会关联到 /signup 而不是 /users?
注意: 我通过运行 rails test:integration 也看到了这个问题
..
assert_equal request.fullpath, 'signup_path'
..
失败信息:
Failure:
UsersControllerTest#test_should_get_signup_page_after_post_request [/home/ubuntu/workspace/sample_app/test/controllers/users_controller_test.rb:13]:
Expected: "/signup"
Actual: "signup_path"
但在这种情况下,预期应该是“/users”。
【问题讨论】:
-
@Gilles Goualiladet 对不起,我误解了这个问题。我的错!
标签: ruby-on-rails tdd ruby-on-rails-5 integration-testing