简体   繁体   中英

get nil on POST and UPDATE controller tests with rspec and capybara

just run a scaffold and then added the correspondent tests. For some reason UPDATE and POST method are not working and respond with "nil". Cant find why. User Controller has the basic REST methods. ApplicationController includes a before_filter:

before_filter :authenticate_user

protected
def authenticate_user
  unless User.find_by_id(session[:user_id])
    redirect_to root_path, notice: "Please log in"
  end
end

user_controller_spec:

describe "POST create" do
describe "with valid params" do
  it "creates a new User" do
    expect {
      post :create, {:user => valid_attributes}, valid_session
    }.to change(User, :count).by(1)
  end

  it "assigns a newly created user as @user" do
    post :create, {:user => valid_attributes}
    expect(assigns(:user)).to be_a(User)
    expect(assigns(:user)).to be_persisted
  end

  it "redirects to the created user" do
    post :create, {:user => valid_attributes}
    expect(response).to redirect_to(User.last)
  end
end

describe "with invalid params" do
  it "assigns a newly created but unsaved user as @user" do
    allow_any_instance_of(User).to receive(:save).and_return(false)
    post :create, {:user => { "email" => "invalid value" }}
    expect(assigns(:user)).to be_a_new(User)
  end

  it "re-renders the 'new' template" do
    allow_any_instance_of(User).to receive(:save).and_return(false)
    post :create, {:user => { "email" => "invalid value" }}
    expect(response).to render_template("new")
  end
end
end

describe "PUT update" do
describe "with valid params" do
  it "updates the requested user" do
    user = FactoryGirl.create(:user)
    expect_any_instance_of(User).to receive(:update).with({ "email" => "user@email.com" })
    put :update, {:id => team.to_param, :user => { "email" => "user@email.com" }}
  end

  it "assigns the requested user as @user" do
    user = FactoryGirl.create(:user)
    put :update, {:id => user.to_param, :user => valid_attributes}
    expect(assigns(:user)).to eq(user)
  end

  it "redirects to the user" do
    user = FactoryGirl.create(:user)
    put :update, {:id => user.to_param, :user => valid_attributes}
    expect(response).to redirect_to(user)
  end
end

describe "with invalid params" do
  it "assigns the user as @user" do
    user = FactoryGirl.create(:user)
    allow_any_instance_of(User).to receive(:save).and_return(false)
    put :update, {:id => user.to_param, :user => { "email" => "invalid value" }}
    expect(assigns(:user)).to eq(user)
  end

  it "re-renders the 'edit' template" do
    user = FactoryGirl.create(:user)
    allow_any_instance_of(User).to receive(:save).and_return(false)
    put :update, {:id => user.to_param, :user => { "name" => "invalid value" }}
    expect(response).to render_template("edit")
  end
end
end

Try to add render_views . Because RSpec tries to speed up specs and it does not render views by default.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM