我开始编写刮刀来获取来自不同网站的数据。我在rake文件中构建了第一个scraper,现在我开始编写第二个rake文件来从第二个站点获取数据。现在,我正在编写一个特定于我感兴趣的每个站点的刮板(不是试图构建一个通用的刮板)。
我有3个问题:
写rake任务对我来说是个不错的选择吗?有没有我应该考虑的替代方案?
如何在rake文件中添加功能/方法? (对不起,非常愚蠢的问题,但我无法弄清楚如何构建我的代码...所以现在它只是500行不间断的代码在一个长方法中),例如,我想要一个“get_description(部分) “从页面返回描述的方法。根据我正在抓取的网站,该方法可能会有所不同。
如何使用RSpec测试我的任务?我想提供一个链接,确保我的任务输出符合我的预期
感谢您的帮助!
答案 0 :(得分:3)
作为一般原则,rake任务应该非常小。将实际行为引用到实际类中。然后可以轻松地测试这些类。
示例:
task :scrape do
Scraper.scrape!
end
class Scraper
def self.scrape!
# do something
end
end
describe Scraper do
# your tests
end
你可以像@brad所说的那样使用thor,它本身就有一个常规的类结构,所以理论上应该更容易测试任务本身。我没有这样做过。
您可以在rake中定义方法,但我不知道它们最终会在何处。你不应该这样做,所以不要打扰。保持任务主体最小化,编写正常代码来完成肮脏的工作。
答案 1 :(得分:1)
如果您想使用它,确定rake没问题,您也可以查看thor,它使用更标准的类似ruby的语法,而不是dsl rake为您提供的。
Rake只是另一个红宝石库,所以你可以在那里包含你喜欢的任何东西。因此,您可以编写自己的库并将其加载到rake文件中。例如,查看Bundler does it的方式。他们刚刚定义了自己的类,然后在其中创建了任务。顺便说一句,它使用了Thor,从我能以某种方式收集代理那些任务到rake,虽然所以我没有彻底地查看它,但我可能是错的。
如果您在自己的库中定义内容,只需像往常一样使用rspec进行任何其他项目,然后用任何方式将该库挂入rake或thor中,然后再参加比赛