如果我在我的控制器测试中存根了 .save 方法,我如何检查是否呈现了正确的显示模板?
If I stub out .save method in my controller test how can I check the correct show template is rendered?
我正在尝试使用 RSpec 在 rails 应用程序中测试控制器创建方法,如下所示:
def create
@user = User.new(user_params)
if @user.save
redirect_to user_path(@user.id)
else
render new_user_path
flash[:error] = "User not saved"
end
end
但是,如果我通过强制 return true
id[= 来阻止测试使用 Active Record 和用户模型来阻止测试 .new
@user
的 27=] 不是由 .save
正常设置的,所以我无法测试它重定向到 user_path(@user.id)
因为 @user.id
是 nil
这是我对 RSpec 的初步测试:
it "creates a user and redirects" do
expect_any_instance_of(User).to receive(:save).and_return(true)
post :create, { user: {name: "John", username: "Johnny98", email: "johnny98@example.com"} }
expect(assigns(:user).name).to eq("John")
expect(response).to redirect_to user_path(assigns(:user))
end
我应该如何在 RSpec 中测试此重定向。
你应该使用模拟 - https://www.relishapp.com/rspec/rspec-mocks/docs。
user = double("user", id: 1, save: true)
那么你应该用刚刚创建的双精度模拟你的方法
expect(User).to receive(:new).and_return(user)
然后测试重定向。
expect(response).to redirect_to user_path(user)
希望对您有所帮助。
我会这样做:
it 'should redirect to a user if save returned true' do
@user_instance = double
@user_id = double
allow(User).to receive(:new).and_return(@user_instance)
allow(@user_instance).to receive(:save).and_return(true)
allow(@user_instance).to receive(:id).and_return(@user_id)
post :create, {:user => valid_attributes}
expect(response).to redirect_to(user_path(@user_id))
end
我正在尝试使用 RSpec 在 rails 应用程序中测试控制器创建方法,如下所示:
def create
@user = User.new(user_params)
if @user.save
redirect_to user_path(@user.id)
else
render new_user_path
flash[:error] = "User not saved"
end
end
但是,如果我通过强制 return true
id[= 来阻止测试使用 Active Record 和用户模型来阻止测试 .new
@user
的 27=] 不是由 .save
正常设置的,所以我无法测试它重定向到 user_path(@user.id)
因为 @user.id
是 nil
这是我对 RSpec 的初步测试:
it "creates a user and redirects" do
expect_any_instance_of(User).to receive(:save).and_return(true)
post :create, { user: {name: "John", username: "Johnny98", email: "johnny98@example.com"} }
expect(assigns(:user).name).to eq("John")
expect(response).to redirect_to user_path(assigns(:user))
end
我应该如何在 RSpec 中测试此重定向。
你应该使用模拟 - https://www.relishapp.com/rspec/rspec-mocks/docs。
user = double("user", id: 1, save: true)
那么你应该用刚刚创建的双精度模拟你的方法
expect(User).to receive(:new).and_return(user)
然后测试重定向。
expect(response).to redirect_to user_path(user)
希望对您有所帮助。
我会这样做:
it 'should redirect to a user if save returned true' do
@user_instance = double
@user_id = double
allow(User).to receive(:new).and_return(@user_instance)
allow(@user_instance).to receive(:save).and_return(true)
allow(@user_instance).to receive(:id).and_return(@user_id)
post :create, {:user => valid_attributes}
expect(response).to redirect_to(user_path(@user_id))
end