これに答える方法はおそらく十数通りあると思いますが、私が好む 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