ruby中的Struct与testdouble

ruby中的Struct与testdouble,ruby,rspec,mocking,Ruby,Rspec,Mocking,在结构上使用rspec double的优缺点是什么?比如说 before :each do location = double "locatoin" location.stub(:id => 1) end vs 测试双打更容易设置 Slip = Struct.new(:id) slip = Slip.new(:id => 1) vs 双重测试生成更多信息性错误消息 require 'spec_helper' class TooLongError < Standar

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

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


测试双打更容易设置

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

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

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
0次失败#通过


这是几个例子——我相信有更多的理由选择双打。

我知道这篇文章自上次发布以来已经有几年了,但你是否介意更改一下这个例子?我不知道荒野或滑倒跟船有什么关系,这让我很难去想办法。如果没有,谢谢你!如果您更喜欢struct,您可以使用OpenStruct.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