1

我的控制器规格文件中有这个

it "should raise 404" do
      business = FactoryGirl.build(:business)
      expect{get :edit, :id => business}.to raise_error(ActiveRecord::RecordNotFound)
    end

如果我是对的,构建不会保存到数据库,所以业务不应该存在,我的测试应该通过,但它没有。

我还尝试了一个字符串作为“id”的值,但它仍然失败。

我试过这个控制器动作:

def edit
    if params[:id].to_i == 0
      name = params[:id].to_s.titleize
      @business = Business.find_by_name!(name)
    else
      @business = Business.find(params[:id])
    end
    respond_with(@business)
  end

一个不存在的 ID,它确实显示了 404。

如果你问为什么会出现这样的情况,我也会让这个动作响应“id”参数的字符串。

应用程序控制器中的此代码接收任何 ActiveRecord::RecordNotFound:

rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found

  private
    def record_not_found
      render :text => "404 Not Found Baby!", :status => 404
    end

为什么我的 404 测试没有通过?

4

2 回答 2

4

您的控制器不会引发ActiveRecord::RecordNotFound异常,它会在 ApplicationController 中从异常中解救出来。所以尝试测试响应代码或文本,比如

  it "should respond with a 404" do
    business = FactoryGirl.build(:business)
    get :edit, :id => business
    response.response_code.should == 404
  end
于 2012-06-03T08:19:43.130 回答
2

我知道我迟到了,但你不应该真的在控制器测试中创建记录。您在模型测试中创建记录。

在您的控制器测试中,如果您希望创建失败,请使用my_model.stub(:save).and_return(false). 如果您希望创建成功,您可以使用my_model.stub(:save).and_return(true)

使用应该...

context "record valid" do
  before :each do
    my_model.stub(:save).and_return(true)
    post :create
  end
  it { should redirect_to(dashboard_url) }
end
于 2012-11-12T11:12:16.687 回答