2016-06-05 15 views
0

Ich habe meine guard-rspec Umgebung mit den in this tutorial beschriebenen Techniken eingerichtet. Ich übe auch Namespacing, wie in Programing Ruby beginnend auf Seite 240 beschrieben. Mein aktuelles Projektverzeichnis befindet sich auf in dem Zweig stack-overflow-post. Ich verwende:Warum scheitert mein Guard-RPET-Test?

❯ ruby -v 
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin15.0] 
❯ rbenv -v                
rbenv 1.0.0 
❯ rbenv versions              
    system 
* 2.1.1 (set by /Users/max/Google Drive/devbootcamp/phase-0-ruby-bulletin-board/.ruby-version) 
    2.1.5 
    2.2.3 
    2.3.1 
❯ bundle exec guard -v             
Guard version 2.3.0 

Ich bin mit einem Test in spec/thread_spec.rb:

require 'spec_helper' 

describe 'RubyBulletinBoard::Thread' do 
    let (:thread) { RubyBulletinBoard::Thread.new } 
    it { expect(thread).to be_kind_of(RubyBulletinBoard::Thread) }  

#  it 'has a valid uuid' do 
#   p thread.uuid 
#   expect(thread.uuid).to be_kind_of(String) 
#  end 

#  it 'has editable title' do 
#   default_title = thread.title 
#   thread.title = "#{default_title} something different" 
#   new_title = thread.title 
#   expect(default_title == new_title).to eq(false) 
#  end  
end 

aber es versagt:

01:50:07 - INFO - Running: ./spec/thread_spec.rb:5 
Run options: include {:locations=>{"./spec/thread_spec.rb"=>[5]}} 

RubyBulletinBoard::Thread 
    example at ./spec/thread_spec.rb:5 (FAILED - 1) 

Failures: 

    1) RubyBulletinBoard::Thread 
    Failure/Error: let (:thread) { RubyBulletinBoard::Thread.new } 
    NameError: 
     uninitialized constant RubyBulletinBoard::Thread 
    # ./spec/thread_spec.rb:4:in `block (2 levels) in <top (required)>' 
    # ./spec/thread_spec.rb:5:in `block (2 levels) in <top (required)>' 

Finished in 0.00055 seconds 
1 example, 1 failure 

Failed examples: 

rspec ./spec/thread_spec.rb:5 # RubyBulletinBoard::Thread 

[1] guard(main)> 

Aber ich habe keine Ahnung, warum, weil die Klasse RubyBulletinBoard::Thread existiert in lib/ruby_bulletin_board/thread.rb:

require_relative 'id' 

module RubyBulletinBoard 
    class Thread 
     attr_reader :uuid 
     attr_accessor :title 

     def initialize 
      @uuid = IdCreator.create_id 
      @title = title 
     end 
    end 
end 

noch seltsamer, wenn ich Kommentar- Linie 2 in lib/ruby_bulletin_board/runner.rb der Test bestanden:

require_relative 'example' 
# require_relative 'thread' # <--- THIS IS LINE 2 

module RubyBulletinBoard 
    class Runner 
     attr_accessor :greeter, :thread 

     def initialize 
      @greeter = RSpecGreeter.new 
      # @thread = RubyBulletinBoard::Thread.new 
     end 

     def run 
      greeter.greet 
      # p @thread.class 
     end 
    end 
end 

rspec Ausgang:

01:53:57 - INFO - Running: ./spec/thread_spec.rb:5 
Run options: include {:locations=>{"./spec/thread_spec.rb"=>[5]}} 

RubyBulletinBoard::Thread 
    should be a kind of RubyBulletinBoard::Thread 

Finished in 0.00114 seconds 
1 example, 0 failures 

[1] guard(main)> 

Es scheint mir, dass einschließlich der Forderung, thread.rb in runner.rb würde nichts mit dem zu tun meine Tests.

  1. Warum ist mein Originaltest in spec/thread_spec.rb fehlgeschlagen?
  2. Warum führt das Auskommentieren der Zeile 2 in lib/runner.rb dazu, dass der Test bestanden wird?

Vielen Dank für Ihre Hilfe :)

Edit:

Die akzeptierte Antwort hat mir geholfen, die Dinge und läuft, kann mehr Fragen in another post

Edit 2 zu finden: Auch nur eine große Entdeckung gemacht: Ich habe eine Datei mit dem Namen thread.rb verwendet, gibt es eine Ruby-Klasse namens Thread, also wenn ich sayi gewesen bin ng require 'thread' in meinem thread_spec.rb es wurde eine Fehlermeldung an:

[1] guard(main)> 
17:57:09 - INFO - Running: spec/thread_spec.rb 
/Users/max/Google Drive/devbootcamp/phase-0-ruby-bulletin-board/spec/thread_spec.rb:4:in `<top (required)>': uninitialized constant RubyBulletinBoard (NameError) 
    from /Users/max/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/configuration.rb:1361:in `load' 
    from /Users/max/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/configuration.rb:1361:in `block in load_spec_files' 
    from /Users/max/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/configuration.rb:1359:in `each' 
    from /Users/max/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/configuration.rb:1359:in `load_spec_files' 
    from /Users/max/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/runner.rb:106:in `setup' 
    from /Users/max/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/runner.rb:92:in `run' 
    from /Users/max/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/runner.rb:78:in `run' 
    from /Users/max/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/lib/rspec/core/runner.rb:45:in `invoke' 
    from /Users/max/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rspec-core-3.4.4/exe/rspec:4:in `<top (required)>' 
    from bin/rspec:17:in `load' 
    from bin/rspec:17:in `<main>' 
17:57:10 - ERROR - Failed: "bin/rspec -f progress -r /Users/max/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/guard-rspec-4.7.2/lib/guard/rspec_formatter.rb -f Guard::RSpecFormatter --failure-exit-code 2 spec/thread_spec.rb" (exit code: 1) 

von thread.rb Umbenennung ->rbb_thread.rb kann ich dann require 'rbb_thread' und ich werde rot auf grün :)

bearbeiten 3: Eine andere Lösung für die Fehler mit thread.rb ist require_relative ../lib/thread und so ist kein Umbenennen erforderlich

Antwort

1

Ein paar Dinge hier:

  1. Wenn Sie Spezifikationen ausführen, führen Sie RSpec wie eine Anwendung aus, und "config" befindet sich in spec/spec_helper.rb. Ich nehme an, es ist leer/irrelevant.

  2. Wenn Sie eine neuere Version von RSpec laufen, können Sie nur Platz --require spec_helper in Ihrer .rspec Datei und Sie erhalten die require "spec_helper" in Ihren Dateien nicht benötigen.

  3. Am besten verwenden Sie RSpec.describe statt einfach describe das erste Mal in einer Datei.

  4. Sie können einen subject Block für bessere Lesbarkeit zusammen mit described_class verwenden. Sie können auch it { is.expected_to verwenden Syntax

  5. describe kann einen Klassennamen anstelle einer Zeichenfolge nehmen. Auf diese Weise wird deutlich, ob Sie die Datei benötigt haben oder nicht. Wenn Sie eine Klasse übergeben, wird subject implizit.

Seit RSpec wie eine eigene App ist, ist es nicht Ihre eigene Bibliothek Dateien standardmäßig enthalten (neuere Versionen von RSpec füge lib-LOAD_PATH). So müssen Ihre Tests einzeln alle Dateien, die sie testen, erfordern, z.

require 'spec_helper' 

describe 'RubyBulletinBoard::Thread' do 
    let (:thread) { RubyBulletinBoard::Thread.new } 
    it { expect(thread).to be_kind_of(RubyBulletinBoard::Thread) }  

wird:

require 'ruby_bulletin_board/thread' 

RSpec.describe RubyBulletinBoard::Thread do 
    it { is_expected.to be_kind_of(RubyBulletinBoard::Thread) }  

Wenn die oben require ausfällt, bedeutet dies, Sie lib im Lastpfad setzen müssen. Überprüfen Sie Ihre spec/spec_helper.rb, wenn das der Fall ist.

Wenn Ihr spec/spec_helper.rb leer ist (oder hat nichts wichtig), können Sie es zusammen mit .rspec entfernen möchten, und rspec --init laufen gut zu erzeugen begann für Sie Vorlage. Stellen Sie sicher, dass Sie die und =end Abschnitte dort auskommentieren.

+0

Danke :) siehe bearbeiten – mbigras

Verwandte Themen