2016-05-18 28 views
0

Ich bin neu in der Unit-Prüfung in Ruby mit RSpec und ich habe Schwierigkeiten, einen sehr grundlegenden Unit-Test durchzuführen. Ich bin es gewohnt, Unit-Tests in Python und JavaScript durchzuführen, und dieses Problem tritt normalerweise nicht auf.Rspec "NoMethodError"

Ich versuche einfach ein STDOUT mit der Puts-Anweisung zu testen. Hier ist meine Spezifikation.

my_spec.rb

require 'my_file' 

    describe C do 
    before(:all) do 
     @c = C.new 
    end 

    describe C do 
     subject(:C) { described_class.new } 
     it 'should print Hello World' do 
     expect {@c.main}.to output("Hello world").to_stdout 
     end 
    end 
    end 

Hier ist my_file.rb

class C 
    def main 
     puts "Hello World" 
    end 
end 

Kein größerer Code hier, nur ein einfacher Test für die Ausgabe, aber ich bin mit dem einem NoMethodError Fehler zu erhalten, wenn ich meinen spec laufen:

Failures: 

    1) C C should print Hello World 
    Failure/Error: expect {@c.main}.to output("Hello world").to_stdout 

    NoMethodError: 
     undefined method `main' for #<C:0x007fe54488a550> 
    # ./spec/my_spec.rb:12:in `block (4 levels) in <top (required)>' 
    # ./spec/my_spec.rb:12:in `block (3 levels) in <top (required)>' 

Es heißt, ich habe eine undefinierte Methode main Wenn ich es in my_file.rb definiert habe, was ich über diesen Fehler weiß, ist es in der Regel wegen mir eine Methode aufrufen, bevor es definiert ist. Nicht sicher, was ich hier falsch mache, da ich dachte, dass die Methode definiert ist. Jede Hilfe wird sehr geschätzt!

Antwort

1

Ich kann für diese zwei mögliche Ursachen denken:

1) Die my_file, dass es sein kann, nicht Sie denken, die man zur Laufzeit geladen wird wird. Ich schlage vor, etwas hineinzulegen, wie zum Beispiel eine puts oder eine raise, um zu sehen, ob die Datei wirklich ausgeführt wird.

Sie könnten require_relative anstelle von require verwenden, da Sie dadurch besser steuern können, welche Datei geladen wird.

2) Sie haben 2 describe 's. Ich würde empfehlen, die innere zu entfernen.

Außerdem gab es 2 Fehler in 1 Zeile in der Spezifikationsdatei; hier ist die korrigierte Version:

expect {@c.main}.to output("Hello World\n").to_stdout 

‚Welt‘ wurde nicht aktiviert, und es gab keine „\ n“ am Ende von „Hallo Welt“.

+0

Danke! Das hat funktioniert. Die Verwendung von 'require_relative' war der richtige Weg. – SalceCodec

Verwandte Themen