【问题标题】:Rails -- use RSpec "get" and "response" methods in Rake taskRails -- 在 Rake 任务中使用 RSpec "get" 和 "response" 方法
【发布时间】:2011-10-07 20:48:52
【问题描述】:

我知道 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 时返回的信息。有人有什么建议吗?

【问题讨论】:

    标签: ruby ruby-on-rails-3 rspec rake rake-task


    【解决方案1】:

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

    基本上,您似乎在这里将视图代码与模型代码混合在一起...模型的对象不应依赖于 html 中的值...如果在视图中发现了一些信息...将其放入 ContentItem model 上的方法中,然后从视图中调用该代码......或从这个 rake 任务中调用。

    编辑: 好的....好吧,如果你真的需要获取一个 URL - 查看 Ruby 的 Net::Http gem - 这将真正获取 URL。 Rails 并没有将其作为标准...即使对于本地 URL。

    然后,您也许可以使用诸如 hpricot 或 nokogiri 之类的解析器来解析结果以找到您需要的标签。

    【讨论】:

    • 我同意 Taryn 这将是理想的 -- 问题是信息正在视图中被计算出来,因此我无法将其移动到模型中。基本上,当我们尝试将它们加载到我们网站上的框架中时,有些网站有时会出现框架破坏,并且我们正在尝试保留远程 url 是否启用了框架破坏的数据库记录(这就是这个 rake 任务应该做的to do) 这样我们就不会在它们出现破坏时尝试加载它们。
    • 所以我正在尝试运行一个 rake 任务,该任务基本上对尝试构建 url 的页面运行 GET http 请求,然后如果框架被破坏,则在数据库中标记它。
    • 好的 - 我添加了一个编辑,它为您提供了一些可以帮助您的示例宝石。祝你好运 - 听起来可能很棘手,因为即使 net::http 也可能不会真正触发帧中断。我不知道这实际上会如何体现在你身上。但至少这是一个开始:)
    • 我尝试使用 net::http 并且它确实成功地访问了该页面,但正如您所预测的那样,没有触发帧中断。关于如何解决它的任何想法?不幸的是,我不认为像 Nokogiri 这样的解析器会成功。
    • 遗憾的是没有。我猜只有 真正的 浏览器会做你想做的事。嗯...我知道有一些测试框架可以启动一个真正的浏览器(Watir 想到了),您可以使用其中一个编写自动化测试 - 尽管它必须全部适用于浏览器窗口。例如“导航到 URL x,如果框架崩溃(不确定你将如何测试)然后导航到 url Y 并输入这些值并点击提交”其中 URL Y 是一个表单,它将导致你想要的 db 更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2017-09-24
    • 2018-06-15
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多