Ich habe einige RSpec-Tests geschrieben, die erfolgreich Objekte mit: let-Anweisungen erstellen. Die Testumgebung behält jedoch nicht die Verknüpfungen bei, die überall anders funktionieren. Unten ist ein Beispiel für eine Klasse, die einen NoMethodError (undefinierte Methode `money 'für nil: NilClass) auftauchen lässt. Geld ist eine Spalte in Inventar. Irgendwelche Gedanken?Wie testet man Klassenmethoden, die auf Assoziationen mit RSpec und Sinatra beruhen?
class Inventory < ActiveRecord::Base
belongs_to :character
def self.return_money(character)
character.inventory.money
end
end
Und hier ist ein entsprechendes Beispiel für eine spec doc:
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
Was ist der Zweck dieser Methode? Was macht es als Klassenmethode von Inventory? Dies ist ein sehr seltsamer Ort, um eine solche Methode zu verwenden, zumal sie auf eine Instanz eines völlig anderen Modelltyps wirkt. – tadman
Ich habe es aus gutem Grund erfunden. die echte Methode ist ein wenig verworren, aber es dauert zwei Zeichen, überprüft ihre Bestände/Gegenstände und führt eine Transaktion zwischen ihnen, wenn gültig – Zollie
Sie wollen wahrscheinlich eine erstklassige "Trade" -Objekt, das damit umgehen kann, und eine Art von Controller, der bewerten kann, ob der Handel legitim ist, ob er fortfahren sollte, und sicherstellen, dass er korrekt verarbeitet wurde. – tadman