2016-09-08 2 views
0

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 
+0

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

+0

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

+0

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

Antwort

0

Es gibt keinen Grund, warum dies nicht funktionieren sollte. RSpec ist nicht speziell, es ist nur normaler Ruby-Code. Sie können dies bestätigen, indem Sie den gesamten Code in einer einzigen Datei, so etwas wie bewegend:

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 

Guesses, was gebrochen werden kann:

  • money ist ein zusammengesetztes Feld oder so ähnlich. Können Sie Ihr Datenbankschema posten?
  • Bibliotheksdateien werden nicht korrekt geladen. Verwenden Sie puts $LOADED_FEATURES, um zu überprüfen, dass alle Dateien, die erforderlich sein sollten, waren.
+0

Hey Xavier, kreisen zurück zu diesem. Müssen Modelle/Tabellen explizit in spec_helper benötigt werden? – Zollie

+0

möglicherweise die Modelldateien, ja. IIRC Ich denke nicht daran, dass Sinatra auf die gleiche Weise autoloadiert wie Rails. (Wenn Sie "$ LOADED_FEATURES" in Ihrer Spezifikation ausgeben, wird Ihnen angezeigt, ob die Modelldateien benötigt wurden oder nicht) –

Verwandte Themen