RSpec控制器测试失败 - 如何加载模拟数据?

时间:2011-03-13 13:18:13

标签: ruby-on-rails rspec

我有两个简单的RSpec测试,我已经为一个小型轨道应用程序编写了我已经完成学习rails。我最初为我的Link类进行了模拟设置,但遇到了同样的问题。

这是我的测试代码:

require 'spec_helper'

describe LinksController do
  render_views
  before(:each) do
    link = Link.new
    link.stub!(:title).and_return("Reddit")
    link.stub!(:url).and_return("http://www.reddit.com")
    link.stub!(:created_at).and_return(Time.now)
    link.stub!(:updated_at).and_return(Time.now)
    link.stub!(:user_id).and_return("1")
    link.stub!(:id).and_return("1")
    link.save

    user = User.new
    user.save
  end

  it "renders the index view" do
    get :index
    response.should render_template('links/index')
    response.should render_template('shared/_nav')
    response.should render_template('layouts/application')
  end

  it "renders the show view" do
    get :show, :id => 1
    response.should render_template('links/show')
    response.should render_template('shared/_nav')
    response.should render_template('layouts/application')
  end
end

我是rails和RSpec的新手,不知道我应该做些什么来让它工作。当您需要数据时,从LinksController测试此show方法的最佳方法是什么?我也尝试过mock_model,但也许我错了。

您可以在Github

上看到所有应用代码

1 个答案:

答案 0 :(得分:4)

问题在于您正在对模型进行存根,因此它不会存储在数据库中。这意味着当您调用get :show, :id => 1时,对数据库的查询将不返回任何内容,并且您的测试将失败。当您想要在不使用数据库的情况下伪造响应或对象时,存根很好,但如果您依赖于使用数据库的实际Rails代码,则无法使用此方法,因为数据库中不存在任何内容。为了解决这个问题,我会完全删除存根模型并实际创建它们。

require 'spec_helper'

describe LinksController do
  render_views
  before(:each) do
    user = User.create

    @link = Link.create :title => "Reddit",
                        :url => "http://www.reddit.com",
                        :user => user
  end

  it "renders the index view" do
    get :index
    response.should render_template('links/index')
    response.should render_template('shared/_nav')
    response.should render_template('layouts/application')
  end

  it "renders the show view" do
    get :show, :id => @link.id
    response.should render_template('links/show')
    response.should render_template('shared/_nav')
    response.should render_template('layouts/application')
  end
end

您还应该最终查看像ShamFactory Girl这样的工厂宝石,以简化测试数据的创建。