我正在为cotroller编写测试,但没有成功。我的测试是:
describe VideosController do
describe 'index' do
it 'should select the index template for rendering' do
Video.stub(:video_exists?).with("KgfdlZuVz7I").and_return(true)
get :index, { :q => "KgfdlZuVz7I" }
response.should render_template('index')
end
end
end
这是控制器。
class VideosController < ApplicationController
def index
if params[:q]
params_hash = CGI::parse(params[:q])
if Video.video_exists?(params_hash.values[0][0])
video = Video.new :video_id => params_hash.values[0][0]
if video.save!
flash[:notification] = "Video found."
else
flash[:notification] = "Video found but not saved to database."
end
redirect_to root_path
else
flash[:notification] = "Video not found."
redirect_to root_path
end
end
end
end
测试没有通过,它会引发消息:
VideosController索引应该选择用于渲染的索引模板 失败/错误:get:index,{:q =&gt; “KgfdlZuVz7I”} 收到:video_exists?与une 预期的论点 预期:(“KgfdlZuVz7I”) 得到:(没有args) 如果可能与其他args一起收到消息,请先存储默认值。 './app/controllers/videos_controller.rb:5:in
index' # ./spec/controllers/videos_controller_spec.rb:12:in
阻止(3级)'
认为我不是在正确的方式上存储视频,因为我只是存在视频存在?但不是新的和保存。但我不知道如何解决这个问题,因为我是TDD和Rspec的新成员。
答案 0 :(得分:3)
作为建议#1,您不应该像在测试中那样写出两次“随机字符串”。这极易受到错误分类的影响,并且很难在视觉上进行验证。请改用:
rnd_id = "KgfdlZuVz7I"
Video.stub(:video_exists?).with(rnd_id).and_return(true)
get :index, { :q => rnd_id }
另外,我不确定params_hash = CGI::parse(params[:q])
应该做什么。为什么不像正常一样使用参数?
class VideosController < ApplicationController
def index
if params[:q]
if Video.video_exists?(params[:q])
video = Video.new :video_id => params[:q]
if video.save!
flash[:notification] = "Video found."
else
flash[:notification] = "Video found but not saved to database."
end
redirect_to root_path
else
flash[:notification] = "Video not found."
redirect_to root_path
end
end
end
end