如何在 Minitest 中测试 rake 任务?

How to test rake task in Minitest?

我的 rails 应用程序中有一个 rake 任务,该任务将职位发布到 facebook。然后更改一些模型值。 所以测试 rake 任务的一种方法是调用 rake 任务并检查已更改的值。

test 'z' do
    # setup some data
    Rake::Task['job:publish_to_facebook'].invoke
    Rake::Task['job:publish_to_facebook'].reenable
    # assert table values that has been changed. 
end

但是如何测试招聘信息是否成功发布到facebook?除了使用 capybaraselenium-webdriver 有没有更好的策略?

即使我使用 stubbing 和 mocking 那么我如何验证我的工作是否发布在 facebook 上?

大多数测试 不应 联系外部 API,主要是因为它会减慢测试速度,并且您也可能 运行 进入速率限制。

Even if i use stubbing and mocking then how can i verify that my jobs are published on facebook?

存根和嘲笑的重点恰恰是不是发布到Facebook。相反,您将创建一个名为 Facebook(例如)的 class,并使用类似 def post_message(message) 的方法。这是该应用程序通往 Facebook 的前门,所有对 Facebook 的调用都通过此 class。然后你可以使用像 Mocha 这样的库在测试期间覆盖 def post_message 。您可以使用它来验证应用程序是否正在尝试 post 消息,并验证消息本身是否正确。它实际上不会 post 消息。

正如我所提到的,您确实想通过对 Facebook 的真实调用进行一些测试(尽管数量不多)。这些可以像你上面显示的那样在测试中,这是一个集成测试,或者它也可以是我上面建议的 Facebook class 的较小单元测试,这将是一个更好的开始观点。为此,您需要在 Facebook 上建立一个测试帐户。然后你的测试应该清除设置中的所有消息并使用 Facebook 的 API 来验证消息实际上是 posted.