繁体   English   中英

如何为使用Rails minitest在运行时生成的类添加方法?

[英]How do I stub a method for a class generated at run-time with Rails minitest?

我想保留对第3方组件的调用,但是在Rails迷你测试中发现这一挑战颇具挑战性。 我将从上面最基本的问题开始。 这是一些非常简化的伪代码,可以更好地解释我要执行的操作:

class RequestController < ActionController::Base
  def schedule
    # Parse a bunch of params and validate

    # Generate a unique RequestId for this request

    # Save Request stuff in the DB

    # Call 3rd party scheduler app to queue request action
    scheduler = Scheduler.new
    submit_success = scheduler.submit_request

    # Respond to caller
   end
 end

因此,我正在为RequestController编写集成测试,并且想取消“ scheduler.submit_request”调用。 我的测试代码如下所示:

def test_schedule_request
  scheduler_response = 'Expected response string for RequestId X'
  response = nil
  Scheduler.stub :submit_request, scheduler_response do
    # This test method calls the RequestController schedule route above
    response = send_schedule_request(TEST_DATA)
  end

  # Validate (assert) response
end

看起来很简单,但是显然我不能为尚不存在的类添加方法。 那么,如何在正在测试的代码中为运行时创建的对象提供类方法呢?

我不确定minitest。 但是在rspec中,您还必须对初始化部分进行存根处理,并返回模拟的调度程序对象

这就是我将如何在rspec中做到这一点。

mock_scheduler = double("scheduler")
Scheduler.stub(:new).and_return(mock_scheduler)
mock_scheduler.stub(:submit_request).and_return(response)

其他选择是

   Scheduler.any_instance.stub(:submit_request).and_return(response)

正如Vimsha指出的那样,您必须首先取消类的初始化。 我无法使用他的代码,但是下面的此修订测试代码具有相同的想法:

def test_schedule_request
  scheduler_response = 'Expected response string for RequestId X'
  response = nil
  scheduler = Scheduler.new
  Scheduler.stub :new, scheduler do
    scheduler.stub :submit_request, scheduler_response do
      # This test method calls the RequestController schedule route above
      response = send_schedule_request(TEST_DATA)
    end
  end

  # Validate (assert) response
end

谢谢戴夫

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM