2014-09-30 15 views
5

Nauka o Rspec 3. Mam pytanie na temat matchers. Tutorial śledzę opiera się na rspec 2.Rspec 3 vs Rspec 2 matchers

describe Team do 

    it "has a name" do 
    #Team.new("Random name").should respond_to :name 
    expect { Team.new("Random name") }.to be(:name) 
    end 


    it "has a list of players" do 
    #Team.new("Random name").players.should be_kind_of Array 
    expect { Team.new("Random name").players }.to be_kind_of(Array) 
    end 

end 

Dlaczego kod powoduje błąd podczas jednej i wykomentowane przechodząc z ostrzeżeniem amortyzacji.

Błąd

Failures: 

    1) Team has a name 
    Failure/Error: expect { Team.new("Random name") }.to be(:name) 
     You must pass an argument rather than a block to use the provided matcher (equal :name), or the matcher must implement `supports_block_expectations?`. 
    # ./spec/team_spec.rb:7:in `block (2 levels) in <top (required)>' 

    2) Team has a list of players 
    Failure/Error: expect { Team.new("Random name").players }.to be_kind_of(Array) 
     You must pass an argument rather than a block to use the provided matcher (be a kind of Array), or the matcher must implement `supports_block_expectations?`. 
    # ./spec/team_spec.rb:13:in `block (2 levels) in <top (required)>' 
+1

Sprawdź to [odpowiedź] (http://stackoverflow.com/questions/19960831/rspec-expect-vs-expect-with-block-whats-the-difference) dla _ dlaczego? _ –

Odpowiedz

6

Należy używać zwykłych nawiasów dla tych testów:

expect(Team.new("Random name")).to eq :name 

Podczas korzystania klamrowych, jesteś przejazdem blok kodu. Dla rspec3 oznacza to, że będzie można umieścić pewne oczekiwania co do realizacji tego bloku, a nie w wyniku egzekucji, tak na przykład

expect { raise 'hello' }.to raise_error 

EDIT:

jednak pamiętać, że ten test nie powiedzie się, jak Team.new zwraca obiekt, a nie symbol. Można zmodyfikować tak przechodzi testu:

expect(Team.new("Random name")).to respond_to :name 

# or 

expect(Team.new("Random name").name).to eq "Random name" 
+0

Otrzymuję błąd z tym. https://gist.github.com/vezu/85661922adda6a877b48. Dziękuję za wyjaśnienie. – Benjamin

+1

@Benjamin - Powiedziałbym, że to jest oczekiwane, ponieważ 'Team.new' zwraca obiekt, a nie symbol. Odpowiedź zaktualizowana. – BroiSatse