2016-04-04 13 views
3

ich die APIonRails tutorial verwenden und sie haben diese:konvertieren alte Rspec Syntax in neue Syntax

require 'spec_helper' 

describe ApiConstraints do 
    let(:api_constraints_v1) { ApiConstraints.new(version: 1) } 
    let(:api_constraints_v2) { ApiConstraints.new(version: 2, default: true) } 

    describe "matches?" do 

    it "returns true when the version matches the 'Accept' header" do 
     request = double(host: 'api.marketplace.dev', 
         headers: {"Accept" => "application/vnd.marketplace.v1"}) 
     api_constraints_v1.matches?(request).should be_true 
    end 

    it "returns the default version when 'default' option is specified" do 
     request = double(host: 'api.marketplace.dev') 
     api_constraints_v2.matches?(request).should be_true 
    end 
    end 
end 

In einem Beispiel, aber ich bin gekommen, um zu verstehen, dass dies die alte Syntax verwendet.

Um dies in die neue Syntax zu konvertieren, ich versuche dies:

require 'rails_helper' 

describe ApiConstraints do 
    let(:api_constraints_v1) { ApiConstraints.new(version: 1) } 
    let(:api_constraints_v2) { ApiConstraints.new(version: 2, default: true) } 

    describe "matches?" do 
    it "returns true when the version matches the 'Accept' header" do 
     request = double(host: 'api.localhost:3000', 
       headers: {"Accept" => "application/vnd.marketplace.v1"}) 
     expect(request).to match(api_constraints_v1) 
    end 

    it "returns the default version when 'default' option is specified" do 
     request = double(host: 'api.localhost:3000') 
     expect api_constraints_v2.matches?(request).to_be true 
    end 
    end 

end 

Dies ist der Fehler Ich erhalte:

Failures: 

    1) ApiConstraints matches? returns true when the version matches the 'Accept' header 
    Failure/Error: expect(request).to match(api_constraints_v1) 
     expected #<RSpec::Mocks::Double:0x3feeedaf60c4 @name=nil> to match #<ApiConstraints:0x007fddde50f9b0 @version=1, @default=nil> 
     Diff: 
     @@ -1,2 +1,2 @@ 
     -#<ApiConstraints:0x007fddde50f9b0 @default=nil, @version=1> 
     +#<RSpec::Mocks::Double:0x3feeedaf60c4 @name=nil> 

    # ./lib/spec/api_constraints_spec.rb:11:in `block (3 levels) in <top (required)>' 

    2) ApiConstraints matches? returns the default version when 'default' option is specified 
    Failure/Error: expect api_constraints_v2.matches?(request).to_be true 
    NoMethodError: 
     undefined method `to_be' for true:TrueClass 
     Did you mean? to_enum 
         to_s 
    # ./lib/spec/api_constraints_spec.rb:16:in `block (3 levels) in <top (required)>' 

Finished in 0.0045 seconds (files took 6.52 seconds to load) 
2 examples, 2 failures 

Failed examples: 

rspec ./lib/spec/api_constraints_spec.rb:8 # ApiConstraints matches? returns true when the version matches the 'Accept' header 
rspec ./lib/spec/api_constraints_spec.rb:14 # ApiConstraints matches? returns the default version when 'default' option is specified 

Was dies verursachen könnte?

Edit 1

Per My Gemfile.lock, das sind die Versionen meiner relevanten Edelsteine:

rspec (3.1.0) 
    rspec-core (~> 3.1.0) 
    rspec-expectations (~> 3.1.0) 
    rspec-mocks (~> 3.1.0) 
rspec-core (3.1.7) 
    rspec-support (~> 3.1.0) 
rspec-expectations (3.1.2) 
    diff-lcs (>= 1.2.0, < 2.0) 
    rspec-support (~> 3.1.0) 
rspec-mocks (3.1.3) 
    rspec-support (~> 3.1.0) 
rspec-rails (3.1.0) 
    actionpack (>= 3.0) 
    activesupport (>= 3.0) 
    railties (>= 3.0) 
    rspec-core (~> 3.1.0) 
    rspec-expectations (~> 3.1.0) 
    rspec-mocks (~> 3.1.0) 
    rspec-support (~> 3.1.0) 
rspec-support (3.1.2) 
rubyzip (1.2.0) 
selenium-webdriver (2.53.0) 
    childprocess (~> 0.5) 
    rubyzip (~> 1.0) 
    websocket (~> 1.0) 
shellany (0.0.1) 
shoulda (3.5.0) 
    shoulda-context (~> 1.0, >= 1.0.1) 
    shoulda-matchers (>= 1.4.1, < 3.0) 
shoulda-context (1.2.1) 
shoulda-matchers (2.8.0) 
    activesupport (>= 3.0.0) 

Was die korrekte neue Syntax ist, sollte ich das Gleiche erreichen zu können, verwenden, die der ursprüngliche Code erreicht?

+0

'erwarten request.to eq (api_constraints_v1)' -> 'erwarten (Anfrage) .to eq (api_constraints_v1)' –

Antwort

4

In der ursprünglichen Test Änderung

api_constraints_v1.matches?(request).should be_true 

zu

expect(api_constraints_v1.matches?(request)).to be_truthy 

oder

expect(api_constraints_v1.matches?(request)).to be(true) 

wenn Sie erwarten, nur ein boolescher Wert zurückgegeben werden.

+0

Perfekt. Genau das habe ich gesucht. Vielen Dank! – marcamillion

+1

Für die Konvertierung vieler alter Syntax-Spezifikationen empfehle ich [transpec] (https://github.com/yujinakayama/transpec). –

1

Änderung

expect request.to eq(api_constraints_v1) 

zu

expect(request).to eq(api_constraints_v1) 

und das gleiche Problem in der anderen spec ...

expect ist ein Verfahren, in dem Sie die Sache geben, dass die Erwartung gehen wird an (dh request) ...

nachdem du gehst das Ergebnis aus der request Methode - rufen Sie dann to drauf ...

So wie du es vorher hatte ... Sie erste Aufruf to auf request und dann vorbei das Ergebnis, dass zu expect sind. .. dh Gruppierung Angelegenheiten;)

+0

Nun, ich denke, die wirkliche Frage ist, ist: 'erwarten (Anfrage) .to sein (api_constraints_v1)' das gleiche wie: 'api_constraints_v1.matches? (request) .should be_true'. Ich bezweifle es. Wie lautet die neue Syntaxversion der alten Syntaxerwartung? – marcamillion

+0

Klammern hinzufügen: '(api_constraints_v1.matches? (Request)). Sollte be_true' sein (obwohl es nicht die beste Praxis für das alte ist) zeigt deutlicher, welcher Teil zu' sollte' (und damit welcher Teil Art von dann zu 'geht) erwarten '). In diesem Fall (vorausgesetzt, dass Ihre API-Einschränkung immer eine Regex ist), könnten Sie sie wahrscheinlich in 'expect (request) .to match (api_constraints_v1)' ändern. Hinweis: Sie verwenden immer Klammern mit der 'expect'-Syntax. Sie sind nicht optional. –

+0

Es gibt mehr Details über den "Match" Matcher in den Dokumenten hier: https://www.relishapp.com/rspec/rspec-expections/docs/built-in-matchers/match-matcher –

0

Ich habe die gleiche ApiConstraints in meinem rails-api-base Projekt verwendet und es stürzt ab, wenn Sie matches? mit einer Nicht-Standard-Version versuchen, ohne den Accept Headers.

Ich habe den folgenden Test (die Abstürze):

it 'returns false when not default and no Accept header' do 
    request = double(host: 'api.marketplace.dev') 
    expect(api_constraints_v1.matches?(request)).to be false 
end 

Und ich feste ApiConstraints:

def matches?(req) 
    @default || 
    (req.respond_to?('headers') && 
    req.headers.key?('Accept') && 
    req.headers['Accept'].include?("application/vnd.marketplace.v#{@version}")) 
end 

Hoffe, es hilft!