我正在尝试制作一个简单的应用。当我在浏览器中测试它时,每个人都可以正常工作。然后,当我尝试使用RSpec(2.5)运行一些测试时,它会失败:为控制器创建测试。
这是我的创建方法:
def create
@website = Website.new(params[:website])
if @website.save
flash[:notice] = "Website created."
redirect_to(:action => 'list')
else
render('new')
end
end
控制器测试:
describe WebsitesController do
render_views
.
.
.
describe "POST 'create'" do
before(:each) do
@attr = { :adres => "www.excc.pl", :opis => "aaa "*22, :tagi => "aaa aaa aaa",
:preview => File.new(Rails.root + 'spec/fixtures/rails.png'),
:preview_mini => File.new(Rails.root + 'spec/fixtures/rails.png')}
end
describe "success" do
it "should have the right title" do
response.should have_selector("title", :content=>"Lista witryn w portfolio")
end
end
.
.
.
此测试的结果:
1) WebsitesController POST 'create' should have the right title
Failure/Error: response.should have_selector("title", :content=>"Lista witryn w portfolio")
expected following output to contain a <title>Lista witryn w portfolio</title> tag:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
# ./spec/controllers/websites_controller_spec.rb:34:in `block (4 levels) in
websites_controller_spec.rb:34指的是创建方法
但是,此测试正确传递(对于不正确的数据,应将其重定向回具有指定标题的“新”网站):
it "should have the right title" do
post :create, :website => @attr.merge(:adres => "")
response.should have_selector("title", :content=>"Dodaj stronę WWW")
end
第二个问题是...... 曾经有一段时间我得到了这样的测试结果:
<html><body>You are being <a href="http://test.host/websites/list">redire cted</a>.</body></html>
...这让我把头发拉了一段时间,直到我做完了(我真的不知道是什么)而且它已经消失了。然而,当我认为它可以在将来毁了我的幸福时,它让我害怕地狱。
对此的任何想法都将不胜感激。
答案 0 :(得分:0)
很难知道这里有什么问题,但我认为问题在于你没有为成功/失败设定条件。如果我理解正确,当您传入空白:adres
属性时,保存将失败,页面应呈现list
操作。因此,您希望存根create
方法并根据预期结果返回true或false:
it "succeeds" do
@website = mock_model(Website,:save=>true)
Website.stub(:new) { @website }
post :create, :website => {}
# redirects
response.should have_selector("etc etc")
end
it "fails" do
@website = mock_model(Website,:save=>false)
Website.stub(:new) { @website }
post :create, :website => {}
# renders 'new'
response.should_not have_selector("etc etc")
end
参数的有效性测试应在模型规范中进行:
@website = Website.new(:adres=>"")
@website.should_not be_valid