ruby-on-rails - RSpec Controller 测试失败 - 如何加载模拟数据?

标签 ruby-on-rails rspec

我为一个小型 Rails 应用程序编写了 2 个简单的 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 测试此显示方法的最佳方法是什么?我也尝试过mock_model,但也许我用错了。

您可以在 Github 上查看所有应用代码

最佳答案

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

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

您最终还应该研究一下工厂 gem ,例如 ShamFactory Girl简化测试数据的创建。

关于ruby-on-rails - RSpec Controller 测试失败 - 如何加载模拟数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5289580/

相关文章:

ruby-on-rails - 工厂未注册

ruby-on-rails - 使用服务类中的计算属性构建哈希

ruby-on-rails - 索引显示顺序

ruby-on-rails - 这个 C# 到 Ruby 的最干净的端口是什么?

ruby - 如何在ruby+Cucumber2.0中添加等待方法等待特定元素加载完毕

ruby - 当我在我的模型上运行 RSpec 时,为什么会出现 "strip"和 "downcase"的未定义方法错误?

ruby-on-rails - 在 RSpec 中销毁的 InvalidAuthenticityToken

ruby-on-rails - 在 Rails 中使用相同部分时显示不同数据的最佳实践

ruby-on-rails - 为什么 irb 插件没有加载到 Rails 控制台 session 中?

ruby - 在多个上下文之间传递变量的 rspec 方法