1

私はこのモジュールを持っています:

module TicketsPresenters

    class ShowPresenter
      def initialize(ticket_or_id = nil)
        unless ticket_or_id.nil?
          if ticket_or_id.is_a?(Ticket)
            @ticket = ticket_or_id
          else
            @ticket = Ticket.find(ticket_or_id)
          end
      end
    end

end

整数を渡すとき、またはオブジェクトインスタンスを直接渡すときに、initialize()メソッドがオブジェクトを正しく設定するかどうかをテストしたいと思います。

4

1 に答える 1

2

これに答える方法はおそらく十数通りあると思いますが、私が好む RSpec 形式を紹介します。

attr_reader :ticket以下は、ShowPresenter クラスにチケットのリーダー メソッド (つまり ) があることを前提としています。また、保存されるように、有効なパラメーターを使用して Ticket オブジェクトを作成していることも前提としています。

describe TicketsPresenters::ShowPresenter do
  context '#initialize' do
    let!(:ticket) { Ticket.create!(...) }

    context 'with an id' do
      subject { TicketsPresenters::ShowPresenter.new(ticket.id) }
      its(:ticket) { should == ticket }
    end

    context 'with a Ticket object' do
      subject { TicketsPresenters::ShowPresenter.new(ticket) }
      its(:ticket) { should == ticket }
    end

    context 'with nothing' do
      subject { TicketsPresenters::ShowPresenter.new }
      its(:ticket) { should be_nil }
    end
  end
end

注: 私はFactoryGirlFactory.create(:ticket)のファンなので、個人的にはoverを使用することを好みTicket.create!(...)ます。有効な Ticket オブジェクトを 1 か所で定義でき、その定義が変更された場合にすべてのテストで更新する必要がないからです。

人々が取るもう 1 つのテストの立場は、データベースの永続性をまったく使用しないことです。これはおそらく、Ruby や RSpec を初めて使用する人にはお勧めできない概念です。説明するのが少し難しく、OOP の知識が必要になるからです。利点は、データベースへの依存がなくなり、テストがより高速になり、より分離されることです。

describe TicketsPresenters::ShowPresenter do
  context '#initialize' do
    let(:ticket) { mock(:ticket, id: 1) }

    before do
      ticket.stub(:is_a?).with(Ticket) { true }
      Ticket.stub(:find).with(ticket.id) { ticket }
    end

    context 'with an id' do
      subject { TicketsPresenters::ShowPresenter.new(ticket.id) }
      its(:ticket) { should == ticket }
    end

    context 'with a Ticket object' do
      subject { TicketsPresenters::ShowPresenter.new(ticket) }
      its(:ticket) { should == ticket }
    end

    context 'with nothing' do
      subject { TicketsPresenters::ShowPresenter.new }
      its(:ticket) { should be_nil }
    end
  end
end
于 2012-07-15T10:41:02.890 に答える