我有两个简单的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
上看到所有应用代码答案 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
您还应该最终查看像Sham和Factory Girl这样的工厂宝石,以简化测试数据的创建。