如果我在我的控制器测试中存根了 .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