2015-04-02 103 views
0

首先,我使用的是Interactor Gem。 (你应该看看,如果你有没有很酷LIB)如何使用Minitest测试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 

我发现this问题/从近3年前的答案,但它并没有为我提供太多的清晰度。也许它在那里,我只是想念一些东西?

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

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

+0

嘿!我认为'间谍'可能会帮助你实现你正在寻找的东西,检查我的其他[答案](http://stackoverflow.com/questions/28813062/idiomatically-mock-openuri-open-uri-with-minitest/28878374 #28878374)。希望有所帮助! – 2015-04-02 12:54:53

+0

谢谢!我会研究并报告。 – jamesconant 2015-04-02 12:57:23

+0

是啊......这很长时间你应该关注的东西在第一个代码清单中用数字'(2)'和'(3)'标记。 – 2015-04-02 13:00:10

回答

0

您不能测试参数,因为参数正在测试中设置。测试必须测试应用程序代码,而不是测试本身。

你应该测试主办单位是否正在做它打算做的事情。

在你的情况,你都在排队后台作业,您可以使用Sidekiq测试,如果队列正在改变,对于为例:

InitiateImport.call(params: params) 

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