如何在布局中测试特定资产(JS,CSS)?

时间:2016-02-23 20:46:39

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

是否可以 - 甚至理智 - 验证资产管道的特定部分是否可用于Rails应用程序的特定布局?

我正在使用Twitter Bootstrap 4(包括其依赖项,如Tether),FontAwesome和DataTables设置一个新的Rails 4.2应用程序。到目前为止,脚手架工作正常。

由于整个事情都是关于网络开发,自我控制(软件开发,即实际上坚持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评估。

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

1 个答案:

答案 0 :(得分:1)

测试资产是否合理,可行,甚至是否有用?当然!不同类型的资产错误会以不同的方式和不同的环境影响您的应用,因此我建议您以不同的方式对其进行测试:

  • 最好在可测量的范围内捕获测试中的资产问题,而不是等到应用程序到达预生产或生产环境。您的应用程序正常运行需要大多数Javascript和大量CSS。因此,如果您还没有,请编写一些验收测试(RSpec功能规范,Cucumber方案或类似的东西)来测试您的重要页面是否正确加载和运行。它们将测试您的功能并偶然测试影响功能的资产是否正在加载。测试任何基于Javascript的行为都可以检查Javascript资产。测试依赖于CSS的行为特征(例如隐藏和显示的元素)是检查CSS资产的方法。编写测试重要场景所需的最少验收测试,以便您的测试套件不会永远耗尽。

    请注意,尽管通过应用功能让您的验收规范测试您的资产是有效的,但它也是唯一一种直接执行此操作的方法。测试资产加载意味着测试正在运行的服务器,这意味着验收测试Rails验收测试通常使用Capybara,它允许您像用户一样点击网页,但是没有为您提供直接对HTML页面之外的其他内容发出HTTP请求的方法。你可以通过将Rack::Test方法导入验收测试来实现,但是考虑到了

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

    它可能不值得这么麻烦。

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

以上策略仅查找影响应用中许多资产或网页的资产错误。如果您想测试每个资产,您需要做更多的工作来以可维护的方式创建列表并测试列表的每个元素。我不认为这是值得的。无论如何,您需要监控应用程序的400和500错误;这将抓住上述策略不常见的错误。