moh*_*del 5 ruby rspec ruby-on-rails
这是我为用户创建的操作:
def create
@user = User.new(user_params)
if @user.save
respond_to do |format|
format.html {
redirect_to edit_admin_user_path(@user)
flash[:success] = "Successfully created"
}
end
else
render :new
flash[:alert] = "Something went wrong"
end
end
Run Code Online (Sandbox Code Playgroud)
我的测试看起来像这样:
context "POST methods" do
describe "#create" do
it "renders the edit template" do
post :create, user: FactoryGirl.attributes_for(:user)
expect(response).to render_template(:edit)
end
end
end
Run Code Online (Sandbox Code Playgroud)
但是我收到这个错误:
Failures:
1) Admin::UsersController POST methods #create renders the edit template
Failure/Error: expect(response).to render_template(:edit)
expecting <"edit"> but was a redirect to <http://test.host/admin/users/80/edit>
Run Code Online (Sandbox Code Playgroud)
我想检查创建用户后是否呈现 edit.html.haml 文件。我究竟做错了什么?
更新 #1 我确实在另一个测试中检查重定向,这是我的完整测试套件:
require 'rails_helper'
RSpec.describe Admin::UsersController, type: :controller do
render_views
context "POST methods" do
describe "#create" do
it "using valid params" do
expect{
post :create, user: { email: "something@hello.com", password: "long12345678" }
}.to change(User, :count).by(1)
# get user_path('1')
end
it "redirects to the edit page after saving" do
post :create, user: FactoryGirl.attributes_for(:user)
user = User.last
expect(response).to redirect_to(edit_admin_user_path(user.id))
end
it "renders the edit template" do
post :create, user: FactoryGirl.attributes_for(:user)
user = User.last
expect {
redirect_to(edit_admin_user_path(user.id))
}.to render_template(:edit)
end
context "it redirects to new" do
it "if user has no valid mail" do
post :create, user: { email: "something", password: "long12345678" }
expect(response).to render_template(:new)
end
it "if user has no valid password" do
post :create, user: { email: "something@mail.com", password: "short" }
expect(response).to render_template(:new)
end
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
我想要的是实际检查编辑模板是否已呈现。因为用expect(response).to redirect_to(edit_admin_user_path(user))它不检查模板。即使我根本没有edit.html.haml 文件,该测试也会通过。
当您测试create操作时,您应该只检查重定向的正确性。在此操作中,您实际上并未渲染edit模板,而只是重定向到edit创建的实体的路径。所以这是你应该检查的事情。
describe "#create" do
it "redirects to the edit path" do
post :create, user: FactoryGirl.attributes_for(:user)
expect(response).to redirect_to(edit_admin_user_path(User.last))
end
end
Run Code Online (Sandbox Code Playgroud)
然后您应该进行另一个操作测试edit,检查模板渲染。这意味着在创建操作中重定向后,您还将看到正确的模板。
| 归档时间: |
|
| 查看次数: |
2770 次 |
| 最近记录: |