2012-12-12 9 views
7

Was wären die Vor- und Nachteile der Verwendung einer RSPEC Double über eine Struktur? Zum BeispielStruct vs test double in Ruby

before :each do 
    location = double "locatoin" 
    location.stub(:id => 1) 
end 

vs

before :each do 
    location = Struct.new("locatoin", :id) 
    location.new.id = 1 
end 

Antwort

8

Test-Doppelzimmer sind einfacher einzurichten

Slip = Struct.new(:id) 
slip = Slip.new(:id => 1) 

gegen

slip = double('slip', :id => 1) 

Test-Doppel erzeugt informative Fehlermeldungen

require 'spec_helper' 

class TooLongError < StandardError; end 

class Boat 
    def moor(slip) 
    slip.moor!(self) 
    rescue TooLongError 
    false 
    end 
end 

describe Boat do 
    let(:boat) { subject } 

    context "when slip won't accept boat" do 
    it "can't be moored" do 
     Slip = Struct.new('Slip') 
     slip = Slip.new 
     boat.moor(slip).should be_false 
    end 
    end 
end 
Failure/Error: slip.moor!(self) 
NoMethodError: 
    undefined method `moor!' for #<struct Struct::Slip > 

gegen

it "can't be moored" do 
    slip = double('slip') 
    boat.moor(slip).should be_false 
end 
Failure/Error: slip.moor!(self) 
    Double "slip" received unexpected message :moor! with (#<Boat:0x106b90c60>) 

-Test verdoppelt haben eine bessere Unterstützung für die Prüfung

class Boat 
    def moor(slip) 
    slip.dont_care 
    slip.moor!(self) 
    rescue TooLongError 
    false 
    end 
end 

it "can't be moored" do 
    Slip = Struct.new('Slip') 
    slip = Slip.new 
    slip.should_receive(:moor!).and_raise(TooLongError) 
    boat.moor(slip).should be_false 
end 
Failure/Error: slip.dont_care 
NoMethodError: 
    undefined method `dont_care' for #<struct Struct::Slip > 

gegen

it "can't be moored" do 
    slip = double('slip').as_null_object 
    slip.should_receive(:moor!).and_raise(TooLongError) 
    boat.moor(slip).should be_false 
end 

0 failures # passed!

, dass ein paar Beispiele ist - ich Ich bin mir sicher, dass es mehr Gründe gibt, Testdoppelungen zu bevorzugen.

+0

Ich weiß, das hat einige Jahre seit es veröffentlicht wurde, aber gibt es eine Chance, dass Sie nichts dagegen hätten, das Beispiel zu ändern? Ich weiß nicht, was Moor oder Slip mit Booten zu tun hat, und es macht es mir schwer zu versuchen, Dinge herauszufinden. Wenn nicht, danke trotzdem! – SirUncleCid