Ruby 轨道——使用RSpec";获得;及;回应";Rake任务中的方法

Ruby 轨道——使用RSpec";获得;及;回应";Rake任务中的方法,ruby,ruby-on-rails-3,rspec,rake,rake-task,Ruby,Ruby On Rails 3,Rspec,Rake,Rake Task,我知道RSpec有一些有用的方法“get”和“response.should”来运行集成测试——我想知道如何在Rake任务中使用这些方法(或其他方法来实现相同的结果): desc "Check all content items with type 0 and do something" task :my_task => :environment do ContentItem.where("content_type = ?", 0).each do |obj| ge

我知道RSpec有一些有用的方法“get”和“response.should”来运行集成测试——我想知道如何在Rake任务中使用这些方法(或其他方法来实现相同的结果):

desc "Check all content items with type 0 and do something"
task :my_task => :environment do
    ContentItem.where("content_type = ?", 0).each do |obj|
        get "/my_path/"+obj.value
        if (response has a certain html tag)
            perform some action on obj
        end        
    end
end

我知道我不能像那样只运行rspec方法,但这实际上是我需要做的,我需要能够处理打开/my_path/obj.value时返回的信息。有人有什么建议吗?

为什么需要通过url对您的ContentItem执行此操作?为什么不直接使用本地obj并做一些事情呢

基本上,看起来你把视图代码和模型代码混在一起了。。。模型的对象不应依赖于html中的值。。。如果视图中有一些信息正在被发现。。。将其放入ContentItem模型上的方法中,并从视图调用该代码。。。或者从这个rake任务中

编辑: 好啊如果你真的需要一个URL——看看Ruby的Net::HTTPGem——它会从字面上获取URL。Rails并不像标准的那样做。。。甚至对于本地URL也是如此


然后,您可能可以使用hpricot或nokogiri之类的解析器来解析结果,以找到所需的标记。

我同意Taryn,这将是一个理想的选择——问题是,信息在视图中得到了解决,因此我无法将其移到模型中。基本上,有些网站在我们尝试将它们加载到我们网站的框架中时,有时会出现框架崩溃,我们正试图保存一个数据库记录,记录远程url是否启用了框架破坏功能(这就是rake任务应该做的)因此,我正在尝试运行一个rake任务,该任务基本上是对试图构建url的页面运行GET http请求,然后如果框架被破坏,则在数据库中标记它。好的,我添加了一个编辑,为您提供了一些示例gems,可以帮助您进行操作。祝你好运-听起来可能有点棘手,因为即使是net::http也可能不会触发帧崩溃。我不知道这对你来说会是怎样的。但至少这是一个开始:)我尝试使用net::http,它确实成功地访问了页面,但正如您所预测的,没有触发帧中断。有什么解决办法吗?不幸的是,我不认为像Nokogiri这样的解析器能做到这一点。遗憾的是,不能。我猜只有真正的浏览器才能做到你想要的。嗯……我知道有一些测试框架可以启动一个真正的浏览器(我想到了Watir),你可以使用其中一个来编写一个自动测试——尽管它必须在浏览器窗口中都适用。例如,“导航到URL x,如果帧崩溃(不确定如何测试),则导航到URL Y并输入这些值,然后点击提交”,其中URL Y是一个表单,将导致所需的db更改。