结构与测试在红宝石中加倍

use*_*140 7 ruby rspec mocking

在结构上使用rspec double的优点和缺点是什么?例如

before :each do
  location = double "locatoin"
  location.stub(:id => 1)
end
Run Code Online (Sandbox Code Playgroud)

VS

before :each do
  location = Struct.new("locatoin", :id)
  location.new.id = 1
end
Run Code Online (Sandbox Code Playgroud)

zet*_*tic 10

测试双打更容易设置

Slip = Struct.new(:id)
slip = Slip.new(:id => 1)
Run Code Online (Sandbox Code Playgroud)

slip = double('slip', :id => 1)
Run Code Online (Sandbox Code Playgroud)

测试双精度生成更多信息性错误消息

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
Run Code Online (Sandbox Code Playgroud)
Failure/Error: slip.moor!(self)
 NoMethodError:
   undefined method `moor!' for #<struct Struct::Slip >
Run Code Online (Sandbox Code Playgroud)

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

测试双打有更好的测试支持

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
Run Code Online (Sandbox Code Playgroud)
Failure/Error: slip.dont_care
 NoMethodError:
   undefined method `dont_care' for #<struct Struct::Slip >
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

0 failures # passed!

这是一些例子 - 我确信有更多理由更喜欢测试双打.