我有以下规格来测试控制器方法:
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世界很新。我错过了什么?感谢。
答案 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