[英]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.