2012-12-12 6 views
7

構造体に対してrspec doubleを使用する場合の長所と短所は何でしょうか?例えば構造体対ルビーのテストdouble

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 

答えて

8

テストダブルを設定することが容易である

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

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

のテストダブルは、より有益なエラーメッセージ

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 > 

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>) 

テストダブルを持って対を生成しますテストのためのより良いサポート

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 > 

対いくつかの例をだ

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!

- Iテストダブルをもっと好む理由があると確信しています。

+0

最後に投稿されてから数年経っていますが、この例を変更しても大丈夫です。私は船や船が船と関係しているかどうかわからず、物事を理解しようとするのは難しいです。とにかくありがとうございました! – SirUncleCid