2011-03-31 86 views
0

我想做一個簡單的應用程序。當我在瀏覽器中進行測試時,everytyhing工作得很好。 Howerver,當我嘗試運行RSpec(2.5)的某些測試時,它失敗了:創建控制器測試。RSpec和怪異的測試結果

這裏是我的創造方法:

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指到c reate方法

然而,這個測試是正確傳遞(對於不正確的數據應該被重定向回與指定標題「新」的網站):

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

很難知道這裏要問什麼,但我認爲問題在於你沒有設定成功/失敗的條件。如果我理解正確,當您傳入一個空白: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 
+0

我已經在下面發佈我的答案... – 2011-04-04 09:27:00