2012-08-10 61 views
0

創建合同時,它將採用單位,用戶和折扣並使用這些參數項目(模型)生成發票。Rails應用程序正常工作正常,但不在rpsec測試中。 「零級」

一切工作正常在瀏覽器中。但是在運行規範時,我得到了undefined method 'value' for nil:NilClass [/app/models/option.rb:19:in 'get_from_database'

Option.rb的第18-20行。這是從數據庫獲取網站選項(由管理員配置)的模型。正常工作正常(瀏覽器測試)。

def self.get_from_database(name) 
    $option[name] = self.find_by_name(name).send('value') 
end 

而且它正在從Contract.rb稱爲:

def start_date=(date) 
    self[:start_date] = Date.strptime(date, Option.get_from_database('short_date')) 
end 

任何想法,爲什麼我得到這個錯誤?如果我註釋掉這一行並重新運行規範測試,我會從另一個類方法調用中獲得另一個nil:NilClass錯誤。

我剛剛開始使用rspec工作,所以我確定我錯過了一些東西。注意:第一次測試有效,第二次測試不起作用。

require 'spec_helper' 

module ContractSpecHelper 
    def contract_params 
    { :start_date => "08/09/2012", 
     :client_id => '1', 
     :pay_interval_id => '1', 
     :billing_day => "1", 
     :prorated => '1', 
     :require_next => "1", 
     :include_today => "1", 
     :unit_id => '45', 
     :due => "1" } 
    end 
end 

describe 'Contract' do 
    include ContractSpecHelper 

    before :each do 
    @contract = Contract.new 
    end 

    describe '#new' do 
    it "requires a unit, user, and pay interval id" do 
     @contract.should_not be_valid 
    end 

    it "creates an invoice once saved" do 
     @contract.attributes = contract_params 
     @contract.save 

     @contract.should have(1).invoice 
    end 
    end 

end 
+0

也許方法「價值」是由元編程創建和它在應用程序中正常工作,因爲方法是在應用程序中創建的,但是在rspec中它不會發生。所以要測試這個片段,你需要適當地設置環境。 – megas 2012-08-10 22:13:30

+0

所以我應該'包括'所有相關的文件,如Option.rb,Invoice.rb,Unit.rb等?如果是這樣,那麼做這件事的最好方法是什麼?如果不是,那麼我應該如何正確設置環境? – 2012-08-10 22:48:06

+0

顯然'find_by_name(name)'返回零。在你的程序中調用這個方法在哪裏?當名稱被調用時,「name」的值是多少?你的** test **數據庫中是否有這樣的對象? – jordanpg 2012-08-10 23:13:31

回答

1

問題出現在Option.find_by_name(name)返回nil。

這最可能的原因是您沒有在測試環境中填充選項表。要麼更改您的代碼以處理不存在的選項記錄,要麼在塊(等)之前使用fixtures/factory_girl/machinist /在您的測試環境中創建選項記錄。

(爲了回答您的其他問題,您的環境應該在你的spec_helper加載。你不應該需要手動包括您的軌道模型到你的rspec的規格。)

+0

有沒有一種方法可以簡單地將開發中的數據(不是結構)克隆到測試? – 2012-08-11 00:26:29

+0

一種方法是將您的開發數據庫數據轉儲到'db/seeds.db',然後使用'rake db:seed RAILS_ENV = test'將數據加載到您的測試環境中。請參閱https://github.com/rhalff/seed_dump以獲取此方法。理想情況下,您應該在測試中或者通過燈具等創建測試環境數據。您應該期望測試環境具有不穩定性。 – jstr 2012-08-11 05:47:21

+0

感謝您的意見!這已經解決了這個問題,我在這個過程中學到了很多關於rspec的知識。我瞭解你對將測試數據庫留空的意見,現在它非常有意義。再次感謝! – 2012-08-11 12:58:53

相關問題