У меня проблемы с тестированием приложения Rails с capybara
. Я пытаюсь проверить, что сообщение создается с определенным комментарием. Проблема в том, что Capybara
не признает мои поля.
3) posts index page adding posts invalid post shows an error
Failure/Error: click_button 'Create Post'
Capybara::ElementNotFound:
Unable to find button "Create Post"
4) Uploading photos displays image on post page
Failure/Error: fill_in 'Description', with: 'My holiday pic'
Capybara::ElementNotFound:
Unable to find field "Description"
<% if @post.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2>
<ul>
<% @post.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= form_for @post, :html => { :multipart => true } do |f| %>
<%= f.label :description %>
<%= f.text_area :description %>
<%= f.label :picture %>
<%= f.file_field :picture %>
<%= f.submit %>
<% end %>
<p class="notice"></p>
<p class="alert"></p>
<div class="container">
<form accept-charset="UTF-8" action="/posts" class="new_post" enctype="multipart/form-data" id="new_post" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="authenticity_token" type="hidden" value="TpeVS+Z1c4x5V+TRRXuGWYP0oLYi7fIlEU8S6f1ugwg=" /></div>
<label for="post_description">Description</label>
<textarea id="post_description" name="post[description]">
</textarea>
<label for="post_picture">Picture</label>
<input id="post_picture" name="post[picture]" type="file" />
<input name="commit" type="submit" value="Create Post" />
</form>
</div>
</body>
</html>
require 'spec_helper'
describe 'posts index page' do
context 'no posts' do
it 'shows a message' do
visit '/posts'
expect(page).to have_content 'No posts yet'
end
end
describe 'adding posts' do
context 'valid post' do
it 'is added to the posts page' do
visit '/posts/new'
fill_in 'Description', with: 'My holiday pic'
expect(current_path).to eq '/posts'
expect(page).to have_content 'My holiday pic'
end
end
describe 'deleting a post' do
it 'removes the post' do
visit '/posts'
click_link 'Delete'
expect(page).not_to have_content 'My holiday pic'
end
end
context 'invalid post' do
it 'shows an error' do
visit '/posts/new'
click_button 'Create Post'
expect(page).to have_content 'error'
end
end
end
end
Я нашел аналогичное решение в соответствующем сообщении, в котором говорится указать id
, например post_description
в new.html.erb
, но это не повлияло.
Решаемые. Проблема заключалась в том, что, поскольку я реализовал аутентификацию пользователя в приложении, но не в тестах, этот метод мешал тестированию найти поля, которые должен видеть только пользователь, зарегистрированный в журнале.
def new
authenticate_user!
@post = Post.new
end
Как только тестовый пользователь был реализован с использованием Factory Girl gem, тесты прошли отлично.