【问题标题】:How to test an Interactor Organizer with Minitest如何使用 Minitest 测试 Interactor Organizer
【发布时间】:2015-04-02 12:52:03
【问题描述】:

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

假设我有一个 Interactor::Organizer,如下所示:

class InitiateImport
  include Interactor::Organizer

  organize CreateImport, QueueImport
end

我还有两个交互器如下:

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 组织者使用有效的参数数据使其通过并验证那里的输出,但是我已经测试了这两个类,我基本上只是在锻炼相同的功能两次。如果可能的话,我真的很想验证方法调用和参数。

任何帮助或建议将不胜感激。

【问题讨论】:

  • 嘿!我认为spy 可能会帮助您实现您正在寻找的东西,请查看我的另一个answer。希望有帮助!
  • 谢谢!我会调查并报告。
  • 是的...你这很长...你应该关注的事情在第一个代码清单中用数字(2)(3)标记。
  • 我突然想到,也许我应该在组织者测试中设置主要测试预期,而不用担心测试两个交互器,因为这只是“实现细节”

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


【解决方案1】:

您无法测试参数,因为参数是在测试中设置的。测试必须测试应用代码,而不是测试本身。

您应该测试组织者是否在做它打算做的事情。

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

InitiateImport.call(params: params)

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

【讨论】:

    猜你喜欢
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多