【问题标题】:Rspec assigning local variable?Rspec分配局部变量?
【发布时间】:2011-11-03 13:46:55
【问题描述】:

只是想知道是否有一种方法可以访问 rspec 中的局部变量而不将它们转换为实例变量?解释我的问题:

我有以下操作:

  def queue_due_mail
    payments = Payment.due_soon.where(:send_reminder => true)
    payments.each do |p|
      PaymentMailer.delay.reminder_email(p)
      p.send_reminder = false
      p.save
    end
    redirect_to root_path
  end

而且,在我的规范中,我想运行这样的东西:

it "should assign nearly due payments to payments" do
  Payment.stub_chain(:due_soon, :where) { [mock_payment] }
  get :queue_due_mail
  assigns[:payments].should eq([mock_payment])
end

问题在于,assigns[:payments] 调用仅在我将局部变量“payments”转换为“@payments”时才有效。这不是主要问题,但我宁愿不让我的 rspec 测试受到实际代码的影响。

那么,有没有办法在 rspec 赋值中引用局部变量?

干杯...

【问题讨论】:

  • Offtopic:重定向时,使用_url而不是_pathHTTP RFC 2616.
  • 我不知道你是怎么做到的,但我认为这可能是因为在你试图做的事情中测试和代码之间存在太多的耦合。您真的需要测试是否分配了局部变量吗?当然,您真正想要检查的是 PaymentMailer 接收到正确的方法调用,并且 mock_payment 将 send_reminder 设置为 false。详细的实现实际上并不重要,因为没有其他代码应该知道支付变量。
  • 点头 是的 - 公平点,尼克。不过,很好奇这是否可能。

标签: ruby-on-rails rspec


【解决方案1】:

基本上没有。将其视为黑盒测试。 rspec 测试进入或退出方法的内容(控制器操作是一种方法)。任何局部变量应该在方法结束时被丢弃 - 因此在方法调用结束时无法测试。

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多