ruby-on-rails - 如何测试涉及异步/并行操作的 Ruby on Rails 方法?

标签 ruby-on-rails ruby testing asynchronous parallel-processing

我有一个创建记录并等待它在循环中接收输入的方法,该循环发生直到记录的内容满足检查。

在正常使用中,该方法创建的记录在创建后显示在页面上的表单中。提交表单会更新记录,导致循环退出以及处理记录的新输入数据的方法。

我如何为此编写测试?我不关心精确模拟用户输入和所有需要的东西;我只想能够修改记录 - 通常由单独的进程完成的任务(来自表单提交的更新)。

Rails 模型中的示例代码:

def self.create_and_wait_on_record(msg)
  rec = create(question: msg)

  # At this point a web page detects this record and displays it in a form

  # Loop until some field on rec has received input (normally via form submission)
  until rec.filled_in?  
    sleep 1.second
    rec.reload
  end

  # Processing rec follows...
end

最佳答案

将测试分成两部分。

测试流程直到您等待输入为止。

然后从提供输入的那一刻开始测试流程。您要跳过的只是表单数据的提交 - 在我看来您不需要测试它。

编辑:在下面澄清您的问题。

我将重新定义 self.create_and_wait_on_record(msg) 以按如下方式工作:

def self.create_and_wait_on_record(msg)
  rec = create(question: msg)

  wait_and_process(rec)     
end

我会有一个测试来验证 create_and_wait_on_record 创建记录并调用 wait_and_process:

it 'Creates the record and continues processing when capable' do 
  subject.should_receive(:wait_and_process).with(stub_rec)
  subject.create_and_wait_on_record(mock_msg)
end

还有一个继续这个过程

it 'Processes a record once it has been created and has had the requisite data populated' do 
   subject.stub(:create).and_return(mock_created_record)
   subject.create_and_wait_on_record(mock_msg)
end

然后您只需确保为测试用例设置了输入,这样 #filled_in? 就不会永久循环。

关于ruby-on-rails - 如何测试涉及异步/并行操作的 Ruby on Rails 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28748216/

相关文章:

mysql - 部署到 Heroku 错误。提供日志

mysql - 字符串.切片!产生奇怪的结果

python - Django 无法加载测试装置,IntegrityError

ruby-on-rails - utf-8 和 ActionMailer

ruby-on-rails - 雪豹+ cucumber /webrat/rspec

ruby-on-rails - Ruby 中的条件正则表达式字符串替换(on Rails)

ruby - 为什么 return 语句会破坏条件运算符?

node.js - 测试 fastify 路由时如何修复 "not ok timeout!"?

ruby - 使用 Rspec 测试 Goliath + Grape

ruby-on-rails - 我怎样才能确保我的 has_many 的大小至少为 2?