Pio*_*ioz 1 integration-testing ruby-on-rails capybara reactjs
我为使用 Rails 创建帖子创建了一个小脚手架,但使用标准表单erb创建了一个简单的 React 组件(我使用 gem react-rails和browserify-rails)。
您可以在此处找到包含所有源代码的示例存储库!
React 组件如下所示:
class NewPostForm extends React.Component {
constructor(props) {
super(props)
this.state = {}
}
render() {
return(
<form action="/posts" accept-charset="UTF-8" method="post">
<input name="utf8" type="hidden" value="?"/>
<input type="hidden" name="authenticity_token" value={this.props.authenticityToken}/>
<div className="field">
<label for="post_title">Title</label>
<input type="text" name="post[title]" id="post_title" onChange={(e) => this.setState({title: e.target.value})} />
</div>
<div className="field">
<label for="post_body">Body</label>
<textarea name="post[body]" id="post_body" onChange={(e) => this.setState({body: e.target.value})}></textarea>
</div>
{ this.state.title &&
<div class="actions">
<input type="submit" name="commit" value="Create Post" data-disable-with="Create Post"/>
</div>
}
</form>
)
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,仅当标题输入字段被填充时,提交按钮才会添加到 DOM。
文件app/views/posts/_form.html.erb是这样的:
<%= react_component 'NewPostForm', {authenticityToken: form_authenticity_token.to_s}, {prerender: true} %>
Run Code Online (Sandbox Code Playgroud)
现在我创建了这个使用 Capybara 的集成测试:
require 'test_helper'
class PostCreationTest < ActionDispatch::IntegrationTest
test "post creation" do
visit new_post_path
fill_in 'post[title]', with: 'Big News'
fill_in 'post[body]', with: 'Superman is dead!'
click_button 'Create Post' # <=== DO NOT FIND THIS BUTTON CAUSE IS ADDED WITH REACT
assert page.has_content?('Post was successfully created.')
end
end
Run Code Online (Sandbox Code Playgroud)
测试失败并出现此错误:
Run options: --seed 21811
# Running:
E
Error:
PostCreationTest#test_post_creation:
Capybara::ElementNotFound: Unable to find visible button "Create Post"
test/integration/post_creation_test.rb:9:in `block in <class:PostCreationTest>'
bin/rails test test/integration/post_creation_test.rb:5
Run Code Online (Sandbox Code Playgroud)
在 test_helper.rb 中,我已将 Capybara 配置为使用 poltergeist 驱动程序。
Capybara.register_driver :poltergeist do |app|
Capybara::Poltergeist::Driver.new(app, {
js_errors: false,
phantomjs_options: ['--ignore-ssl-errors=yes', '--ssl-protocol=any'],
debug: false,
timeout: 500,
phantomjs: File.absolute_path(Phantomjs.path)
})
end
Capybara.javascript_driver = :poltergeist
Capybara.server_port = 3001
Run Code Online (Sandbox Code Playgroud)
如果我总是{ this.state.title &&在反应组件中显示提交按钮(删除),则测试成功通过。
那么,有没有办法让这个测试与这个设置和 React 组件一起工作?
你在这里有几个问题。首先是您实际上并没有使用支持 JS 的驱动程序运行您的测试。您已经配置poltergeist了与水豚用,但是你从来没有跟水豚在使用如果你想要的特定测试使用的设置Capybara.current_driver-见https://github.com/teamcapybara/capybara#using-capybara-with-minitest
添加Capybara.current_driver = Capybara.javascript_driver因为失败的测试会引发您遇到的下一个问题。
PhantomJS(由 Poltergeist 使用)目前不支持 ES5.1+ JS 或现代 CSS,所以如果你想使用它,你需要 polyfill 并转换回 ES5 级别。如果您停止在 Poltergeist 配置 ( js_errors: true) 中隐藏 JS 错误,这将立即变得清晰。由于这个原因,最初的错误是您的代码使用了Map直到 ES6/2015 才添加的类,因此它不受 Poltergeist 支持(没有 polyfill)。
作为 Capybara JS 测试的初学者,您可能最好开始需要使用 selenium 进行测试的 JS(这样您就可以确切地看到发生了什么并支持现代 JS/CSS),然后当测试工作时可能会继续使用 selenium 和无头镀铬或无头 FF。
Capybara.javascript_driver = :selenium # or :selenium_chrome
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2608 次 |
| 最近记录: |