繁体   English   中英

使用Minitest在Rails应用程序中测试Javascript

[英]Testing Javascript in a Rails application with Minitest

我正在使用React react-rails gem(因此正在使用资产管道)制作一个用React在我的视图中渲染的Rails应用程序。

当我尝试测试我的React视图时,未加载React组件,因此无法测试其内容。 例如,我的一项集成测试如下所示:

require 'test_helper'

class TabsIndexTest < ActionDispatch::IntegrationTest

  test "index" do
    get tabs_path
    assert_template 'tabs/index'
    assert_select 'table'
  end
end

这将测试该索引页是否具有table元素。 应该,但是测试没有加载我的React元素,所以看不到一个。 (但是,如果我测试了<div data-react-class=...> ,那就通过了,让我知道JS没有运行)。

有什么方法可以使我的React组件对Minitest测试可见?

我建议不要在功能测试中测试这样的组件。

许多assert_都在Rails中过时了。 确实,控制器测试应该只检查HTTP状态代码(:ok,:not_found)

更多信息在这里: https : //github.com/rails/rails/issues/18950

如果您真的想以这种方式测试组件,则可以将集成测试与水豚和无头铬之类的东西一起使用来执行JS。

在此处快速撰写: https : //robots.thoughtbot.com/headless-feature-specs-with-chrome

我个人建议改用JS单元测试和/或快照,以我的经验,它们是快速而友好的:

https://facebook.github.io/jest/docs/en/tutorial-react.html https://facebook.github.io/jest/docs/en/snapshot-testing.html

一个非常简单的解决方案(而不是使用茉莉花等)使这些助手成为可能:

  def assert_async_js_equal(expected, script)
    script = <<~SCRIPT
      done = arguments[arguments.length - 1];
      #{script}.then((result) => {
        done(result)
      })
    SCRIPT

    assert_equal(expected, page.evaluate_async_script(script), script)
  end

  def assert_js_equal(expected, script)
    assert_equal(expected, evaluate_script(script), script)
  end

那么您可以执行以下操作:

assert_async_js_equal("your_value", "your.promise('code')")
assert_js_equal([1, 2, 3], "[1, 1 + 1, 2 + 1]")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM