2016-09-08 1 views
0

私はlet文を使ってオブジェクトを正常に作成するいくつかのRSpecテストを書いています。ただし、テスト環境では、他の場所で正常に機能する関連付けは維持されません。以下は、NoMethodErrorを返すクラスの例です(未定義メソッド `money 'for nil:NilClass)。 Moneyは在庫の列です。何かご意見は?RSpecとSinatraとの関連付けに依存するクラスメソッドをテストするには?

class Inventory < ActiveRecord::Base 
    belongs_to :character 

    def self.return_money(character) 
    character.inventory.money 
    end 
end 

そして、ここでは、仕様ドキュメントのために、対応する例を示します

require 'spec_helper' 

describe 'Test methods' do 
    let(:trader) { 
    Character.create(
     name: "Trader", 
     location_id: 1) 
    } 
    let(:trader_inventory) { 
    Inventory.create(
     character_id: trader.id, 
     storage_capacity: 50000, 
     money: 20000, 
     markup: 1.35) 
    } 

    it "test method" do 
    expect(Inventory.return_money(trader)).to eq(100) 
    end 

end 
+0

このメソッドの目的は何ですか?それはインベントリのクラスメソッドとして何をしていますか?これは、特に完全に異なるタイプのモデルのインスタンスに作用するので、このようなメソッドを置くには非常に奇妙な場所です。 – tadman

+0

私は例のためにそれを作った。実際の方法は少し畳み込まれていますが、2文字で取り込み、有効な場合はインベントリ/アイテムをチェックし、トランザクション間でトランザクションを実行します。 – Zollie

+0

これを処理できるファーストクラスの "Trade"オブジェクトを作成したいと思うかもしれません。貿易が合法であるかどうかを評価し、それを進めるべきかどうか、そしてそれが正しく処理されたことを確認できるコントローラ。 – tadman

答えて

0

これがうまくいかなければならない理由はありません。 RSpecは特別なものではなく、通常のRubyコードです。あなたが単一のファイルにすべてのコードを移動することでこれを確認することができ、何かのように:破損する可能性がどのようになど

ActiveRecord::Base.establish_connection(:adapter => 'sqlite3', :database => ':memory:') 
ActiveRecord::Base.logger = Logger.new(STDOUT) 

class Inventory < ActiveRecord::Base 
end 
class Character < ActiveRecord::Base 
    has_one :inventory 
end 

describe 'test' do 
    it 'works' do 
    puts Character.first.inventory.money.inspect 
    end 
end 

の推測:

  • moneyは、複合フィールドまたはそのような何かがあります。データベーススキーマを投稿できますか?
  • ライブラリファイルが正しくロードされていません。 puts $LOADED_FEATURESを使用して、必要なファイルがすべて存在することを確認します。
+0

ちょっとXavier、これに回り回る。モデル/テーブルをspec_helperに明示的に指定する必要はありますか? – Zollie

+0

おそらくモデルファイル、そうです。 IIRC私はSinatraがRailsと同じ方法で自動的にロードすることはありません。 (あなたの仕様に '$ LOADED_FEATURES'を投げ捨てると、モデルファイルが必要かどうかが分かります) –

関連する問題