我正在尝试使用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中测试此重定向。
答案 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