Rspec存根不起作用

时间:2012-03-31 09:41:10

标签: ruby-on-rails ruby rspec

我有以下规格来测试控制器方法:

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

控制器本身:

def create
  @user = User.new(params[:user])
  if @user.save
    redirect_to "/", :notice => "User created"
  else
    render "new"
  end
end

非常直接的代码,但不知何故stub!方法实际上并不是真正的存根,所以第二个规范失败了expecting <"new"> but rendering with <"">。它只是重定向,如果valid?返回true。

我对Rails世界很新。我错过了什么?感谢。

1 个答案:

答案 0 :(得分:4)

保存对象时,Rails会在类的实例上调用valid?。但是你已经在类本身上隐藏了valid? 。那不行。

您要在此处执行的操作是正在保存的用户的实例上的存根save,例如

User.stub(:new) { mock_model(User, :save => true) }

@user = User.new #@user现在是一个模拟对象

@user.save #mock对象返回true

对于另一个例子:

User.stub(:new) { mock_model(User, :save => false) }

@user = User.new#再次,@ user是模拟

@user.save #mock对象返回false