如果我在我的控制器测试中存根.save方法测试如何检查正确的显示模板?

时间:2015-06-09 16:26:56

标签: ruby-on-rails ruby rspec capybara

我正在尝试使用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

但是,如果我通过强制它.new true @user来阻止测试使用Active Record和用户模型来阻止测试使用.save } user_path(@user.id)未正常设置,因此我无法测试重定向到@user.id,因为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 为nil

以下是我对RSpec的初步测试:

dropzone.js

我应该如何在RSpec中测试此重定向。

2 个答案:

答案 0 :(得分:5)

你应该使用模拟 - https://www.relishapp.com/rspec/rspec-mocks/docs

expect(User).to receive(:new).and_return(user)

然后你应该用你刚刚创建的双重模拟你的方法

expect(response).to redirect_to user_path(user)

然后测试重定向。

RSpec.configure do |config|
    config.include RspecSequel::Matchers
    #...other config..
end

我希望这会有所帮助。

答案 1 :(得分:1)

我会这样做:

  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