可能有十几种方法可以回答这个问题,但我会给你我喜欢的 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
注意:我是FactoryGirl的粉丝,所以我个人更喜欢使用Factory.create(:ticket)
over,Ticket.create!(...)
因为它允许您在一个地方定义一个有效的 Ticket 对象,并且如果该定义发生更改,您不需要在所有测试中更新它。
人们采取的另一个测试立场是根本不使用数据库持久性。这可能不是我向 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