Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RSpec,如何在模块内测试初始化_Ruby On Rails_Rspec - Fatal编程技术网

Ruby on rails RSpec,如何在模块内测试初始化

Ruby on rails RSpec,如何在模块内测试初始化,ruby-on-rails,rspec,Ruby On Rails,Rspec,我有这个模块: 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

我有这个模块:

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()方法是否正确设置了对象。

可能有十几种方法可以回答这个问题,但我会给出我喜欢的RSpec格式

以下假设您在ShowPresenter类中有一个用于ticket的reader方法(即attr\u reader: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
注意:我是的粉丝,所以我个人更喜欢使用
Factory.create(:ticket)
而不是
ticket.create!(…)
因为它允许您在一个位置定义一个有效的票证对象,并且如果该定义发生更改,您不需要在所有测试中更新它

人们采取的另一个测试立场是根本不使用数据库持久性。这可能不是我向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

我的建议是,您不提供传递票证id或票证对象的功能。如果您在初始化演示者时拥有该id,那么只需实例化ticket对象并始终将其传入即可。不需要增加复杂性。