2013-09-24 70 views
1

我剛剛開始在新項目中使用RSpec(在成爲最小用戶一段時間後)。我創建了一個叫做合同的MVC。下面是模型文件:ActiveRecord報告驗證失敗,但沒有定義驗證

class Contract < ActiveRecord::Base 
    attr_accessible :name, :number, :plannedStart, :actualStart, :plannedCompletion, :actualCompletion 
end 

我已經得到了合同規定的基本工廠(這是稍微複雜一些較早,使用序列來生成新的姓名和電話號碼,但我刪除了所有的,要儘量簡化擠壓這個bug):

FactoryGirl.define do 

    factory :contract do 

    end 
end 

這裏是產生(幾乎是自動的規格,除了我在調用工廠)補充說:

require File.dirname(__FILE__) + '/../spec_helper' 

describe ContractsController do 
    render_views 

    it "index action should render index template" do 
    create(:contract) 
    get :index 
    response.should render_template(:index) 
    end 

    it "show action should render show template" do 

    create(:contract) 
    get :show, :id => Contract.first 
    response.should render_template(:show) 
    end 

    it "new action should render new template" do 
    get :new 
    response.should render_template(:new) 
    end 

    it "create action should render new template when model is invalid" do 

    Contract.any_instance.stubs(:valid?).returns(false) 
    post :create 
    response.should render_template(:new) 
    end 

    it "create action should redirect when model is valid" do 

    Contract.any_instance.stubs(:valid?).returns(true) 
    post :create 
    response.should redirect_to(contract_url(assigns[:contract])) 
    end 

    it "edit action should render edit template" do 
    create(:contract) 
    get :edit, :id => Contract.first 
    response.should render_template(:edit) 
    end 

    it "update action should render edit template when model is invalid" do 
    create(:contract) 
    Contract.any_instance.stubs(:valid?).returns(false) 
    put :update, :id => Contract.first 
    response.should render_template(:edit) 
    end 

    it "update action should redirect when model is valid" do 
    create(:contract) 
    create(:contract) 
    Contract.any_instance.stubs(:valid?).returns(true) 
    put :update, :id => Contract.first 
    response.should redirect_to(contract_url(assigns[:contract])) 
    end 

    it "destroy action should destroy model and redirect to index action" do 
    create(:contract) 
    contract = Contract.first 
    delete :destroy, :id => contract 
    response.should redirect_to(contracts_url) 
    Contract.exists?(contract.id).should be_false 
    end 
end 

當我運行規範,我得到以下錯誤消息,但我得到的這些數量從運行不同運行:

ActiveRecord::RecordInvalid: Validation failed: 
./spec/controllers/contracts_controller_spec.rb:39:in `block (2 levels) in <top (required)>' 

ActiveRecord::RecordInvalid: Validation failed: 
./spec/controllers/contracts_controller_spec.rb:45:in `block (2 levels) in <top (required)>' 

ActiveRecord::RecordInvalid: Validation failed: 
./spec/controllers/contracts_controller_spec.rb:7:in `block (2 levels) in <top (required)>' 

10 examples, 3 failures, 7 passed 

Finished in 0.360139 seconds 
/Users/jlee/.rvm/rubies/ruby-1.9.3-p194/bin/ruby -S rspec ./spec/controllers/contracts_controller_spec.rb ./spec/models/contract_spec.rb failed 

我實現Databasecleaner只是爲了確保這不是與測試過程中使用事務的一些奇怪的行爲問題,但無濟於事。建議?我沒有定義任何驗證,所以很難理解我如何驗證失敗。

+0

該問題似乎與導致驗證失敗的規格有關,但爲什麼會觸發錯誤有點令人困惑。我會繼續研究。 –

回答

0

存根:for valid?掛在兩次測試之間,所以我把以下內容放在before(:each)塊中:Contract.any_instance.unstub(:valid?),它清除了所有東西。

+0

如果我使用燈具,我想這不會顯示出來,因爲在運行結束時出現殘存測試。如果已經存留的東西只在特定規範的持續時間內持續存在,那將會很好,但是...... –