如何在Rails中使用'Thread.new'测试代码?

6
在我的Rails应用程序中,注册类(Signup Class)具有以下功能:
def register_email
  # Something...
  add_to_other_thread do
    send_verification_email
  end
end

def add_to_other_thread(&block)
  Thread.new do
    yield
    ActiveRecord::Base.connection.close
  end
end

我希望对这些进行三项测试。

  1. add_to_other_thread(&block)的测试:
    在调用add_to_other_thread并传入某个块后,检查是否使用正确的块调用了Thread.new。
  2. register_email的测试:
    在调用register_email后,检查add_to_other_thread(&block)是否获得了正确的块。
  3. 整体测试:
    用户注册后,通过其他线程检查是否已发送正确的电子邮件(通过ActionMailer::Base.deliveries)。

可能是 如何在Rails中测试proc和yield? 的重复问题。 - Drenmi
@Drenmi 这个问题不是“如何在Rails中测试proc和yield”的重复。上面的问题是关于'Thread.new',而后一个问题是关于“在测试中覆盖类或块延迟测试”。后一个问题仅涉及上述解决方案的可能细节。 - cancue
2个回答

2
使Thread.new只执行块而不执行线程相关的操作。可以对Thread.new进行存根化(stub)或模拟(Mock),或者替换它。
expect(Thread).to receive(:new).and_yield

另请参阅 在Ruby中测试线程代码

0
除了 @kwerie 的答案之外,在测试中你也可以将 add_to_other_thread 的返回值(即一个 Thread)赋值给一个变量,然后在运行测试之前等待它完成:
thread = signup.add_to_other_thread
thread.join
# your test goes here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接