I have following spec to test controller method:
context "#create" do
it "should redirect when model is valid" do
User.stub!(:valid?).and_return(true)
post :create, :user => FactoryGirl.attributes_for(:user)
response.should redirect_to("/")
end
it "should render new template when model is invalid" do
User.stub!(:valid?).and_return(false)
post :create, :user => FactoryGirl.attributes_for(:user)
response.should render_template(:new)
end
end
And controller itself:
def create
@user = User.new(params[:user])
if @user.save
redirect_to "/", :notice => "User created"
else
render "new"
end
end
Pretty much straightforward code, but somehow stub! method just doesn’t really stubs, so second spec fails with expecting <"new"> but rendering with <"">. It just redirects like if valid? returned true.
I’m quite new to Rails world. What am I missing? Thanks.
When saving an object, Rails calls
valid?on an instance of a class. But you’ve stubbedvalid?on the class itself. That won’t work.What you want to do here is stub
saveon the instance of User that is being saved, e.g.User.stub(:new) { mock_model(User, :save => true) }@user = User.new# @user is now a mock object@user.save# mock object returnstrueFor the other example:
User.stub(:new) { mock_model(User, :save => false) }@user = User.new# again, @user is a mock@user.save# mock object returnsfalse