私は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
このメソッドの目的は何ですか?それはインベントリのクラスメソッドとして何をしていますか?これは、特に完全に異なるタイプのモデルのインスタンスに作用するので、このようなメソッドを置くには非常に奇妙な場所です。 – tadman
私は例のためにそれを作った。実際の方法は少し畳み込まれていますが、2文字で取り込み、有効な場合はインベントリ/アイテムをチェックし、トランザクション間でトランザクションを実行します。 – Zollie
これを処理できるファーストクラスの "Trade"オブジェクトを作成したいと思うかもしれません。貿易が合法であるかどうかを評価し、それを進めるべきかどうか、そしてそれが正しく処理されたことを確認できるコントローラ。 – tadman