ruby-on-rails - 如何测试特定 Assets (JS、CSS)在布局中是否可用?

标签 ruby-on-rails ruby-on-rails-4 testing rspec asset-pipeline

验证 Assets 管道的特定部分在 Rails 应用的特定布局中是否可用——甚至是理智的——是否可行?

我正在使用 Twitter Bootstrap 4(包括它的依赖项,如 Tether)、FontAwesome 和 DataTables 设置一个新的 Rails 4.2 应用程序。脚手架目前运行良好。

因为整个事情是关于网络开发、 self 控制(w.r.t. 软件开发,即实际上坚持 TDD 和 BDD 的平衡组合)的培训,所以我想确保测试几乎所有可能出错的东西.这包括在需要的所有端点上提供上述所有框架内容。

最终,我想写如下内容:

describe 'layouts/application.html.erb', type: :layout, js: true do
  it 'has jQuery' do
    render
    expect(render).to have_js :jquery
  end

  it 'has TWBS v4' do
    render
    expect(render).to have_js :twbs4
    expect(render).to have_css :twbs4
  end
end

显然,这些 .to have_js :jquery.to have_{js,css} :twbs4需要在后台有一些东西,例如 $.fn.jquery 的 Javascript 评估.

测试这样的东西是否明智?

最佳答案

测试您的 Assets 是否明智、可能甚至有用?当然!不同类型的 Assets 错误会以不同的方式在不同的环境中影响您的应用,因此我建议以不同的方式对其进行测试:

  • 最好在测试中尽可能发现 Assets 问题,而不是等到您的应用进入预生产或生产环境。您的大部分 Javascript 和大量 CSS 都是您的应用程序正常运行所必需的。因此,如果您还没有编写一些验收测试(RSpec 功能规范、Cucumber 场景或类似的东西)来测试您的重要页面是否正确加载和运行。他们既会测试您的功能,也会顺便测试影响功能的 Assets 是否正在加载。测试任何基于 Javascript 的行为都可以检查 Javascript Assets 。测试依赖于 CSS 的行为特征,例如隐藏和显示的元素,是检查 CSS Assets 的方法。编写测试重要场景所需的最少验收测试,这样您的测试套件就不会花很长时间。

    请注意,虽然让您的验收规范通过应用功能测试您的 Assets 很有效,但这也是唯一直接的方法。测试 Assets 加载意味着测试正在运行的服务器,这意味着验收测试。 Rails 验收测试通常使用 Capybara,它可以让您像用户一样点击网页,但不会让您直接向 HTML 页面以外的内容发出 HTTP 请求。您可以通过导入 Rack::Test 来做到这一点方法进入您的验收测试,但考虑到这一点

    • 正常的验收测试已经测试了您的大部分 Assets ,并且
    • 无论如何,您都需要在生产或预生产环境中进行一些测试(见下文)

    这可能不值得麻烦。

  • 根据我的经验,有些类的 Javascript 和 CSS Assets 错误只出现在一个人的预生产或生产环境中,而图像和其他 Assets (如字体)的错误通常出现在那些环境中。因此,在您的预生产环境中运行一些冒烟测试是很有值(value)的。我发现使用 curl 或任何你喜欢的方式获取一些 URL(你的主页、其他重要页面类型的示例、重要 Assets )效果非常好,确保它们以 HTTP 状态 200 响应,并确保文本响应包含一些预期的字符串。由于许多仅用于生产的 Assets 错误实际上会破坏加载这些 Assets 的所有页面(例如 config/environments/production.rb 中的错误),因此仅对少数页面进行冒烟测试就足以捕获大部分生产-仅 Assets 错误。

上述策略只会发现影响您应用中许多 Assets 或页面的 Assets 错误。如果您想测试每一项 Assets ,您需要做更多的工作来以可维护的方式制作列表并测试列表的每个元素。我认为这不值得。无论如何,您需要监控应用程序的 400 和 500 错误;这将捕捉到上述策略没有捕捉到的不太常见的错误。

关于ruby-on-rails - 如何测试特定 Assets (JS、CSS)在布局中是否可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35587835/

相关文章:

testing - 如何在 Postman 中根据请求设置变量

java - 无法使用 JUnit 4.11 捕获带有 ExpectedException 的 UnrecognizedPropertyException

angular - 如何在 Karma 中运行特定的测试文件? ( Angular 4+)

ruby-on-rails - 为什么包含 Rescuable 模块不起作用?

javascript - 如何在 Rails 中将拖放项目的顺序保存到数据库中?

arrays - 从数据库列创建数组的最快方法是什么?

ruby-on-rails - ruby on Rails 4 - 一页上同一模型的多个表单

ruby-on-rails - 使用 ActiveMerchant 自定义 Paypal Express 的评论页面

ruby-on-rails - 我如何重组这个大型 PostgreSQL 9.3 表,以便从 Rails 应用程序更有效地建立索引和搜索?

ruby-on-rails - 当我在 Rails 中运行测试时,我该如何处理这个错误?