如何使用Minitest测试Interactor Organizer

时间:2015-04-02 12:52:04

标签: ruby-on-rails ruby ruby-on-rails-4 testing minitest

首先,我正在使用Interactor Gem。 (你应该检查一下,如果你没有。非常酷的lib)

假设我有一个Interactor :: Organizer如下:

class InitiateImport
  include Interactor::Organizer

  organize CreateImport, QueueImport
end

我还有两个Interactors如下:

class CreateImport
  include Interactor

  def call
    import = Import.create()
    if import
      context.import = import
    else
       context.fail!(message: 'import failed!')
    end
  end
end

class QueueImport
  include Interactor

  def call
    unless QueueHandler.perform_later(context.import.id)
      context.fail!(message: 'Queue broke!')
    end
  end
end

大问题 - 我如何 - 使用Minitest - 使用参数organize

测试InitiateImport[CreateImport, QueueImport]的调用情况

assert_send会让我验证是否正在调用organize,但它不会让我验证我传递的参数。像这样:

class InitiateImportTest < Minitest::Test  
  def test_organize_called
    InitiateImport.new(file: file)

    assert_send([InitiateImport, :organize, [CreateImport, QueueImport]])
  end
end

我在近3年前发现this个问题/答案,但它并没有为我提供太多清晰度。也许它就在那里,我只是错过了什么?

我也意识到我可以call组织者使用有效的param数据,这样它就会通过,我会从那里验证输出,但是我已经测试了这两个类了,我基本上只是两次行使相同的功能。我真的很想在可能的情况下验证方法调用和参数。

非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:1)

你无法测试参数,因为测试中设置了参数。测试必须测试应用程序代码,而不是测试本身。

你应该测试组织者是否正在做它想做的事情。

在您的情况下,您正在排队后台作业,您可以测试是否正在更改队列,例如使用Sidekiq:

InitiateImport.call(params: params)

assert_equal 0, QueueHandler.jobs.size
QueueHandler.perform_async(1, 2)
assert_equal 1, QueueHandler.jobs.size