Ruby on rails 单击按钮未在正确的时间触发?(Rspec&x2B;水豚)
我正在测试以下内容:Ruby on rails 单击按钮未在正确的时间触发?(Rspec&x2B;水豚),ruby-on-rails,rspec,capybara,Ruby On Rails,Rspec,Capybara,我正在测试以下内容: 用户创建一篇文章(新页面),然后重定向到显示页面(文章另存为“已发布”) 他进入编辑页面,点击“保存草稿”按钮,他再次被重定向到显示页面 他再次进入编辑页面,现在他应该看到类似这样的内容:状态:“草稿”(以前是状态:“已发布”) 规格: describe "post status" do let!(:post) { FactoryGirl.create(:post, user: user,
状态:“草稿”(以前是状态:“已发布”)
describe "post status" do
let!(:post) { FactoryGirl.create(:post, user: user,
title: "Lorem",
content: "Lorem Ipsum",
status: "Published",
#category_id: category.id,
tag_list: "#{tag.id}") }
before do
sign_in user
visit edit_post_path(post)
end
describe "edit page" do
it { should have_selector('h1', text: "Update post") }
it { should have_selector('span', text: "Published") }
end
let(:save_draft) { "Save Draft" }
let(:publish) { "Publish" }
describe "save as draft" do
before do
click_button save_draft
visit edit_post_path(post)
end
it { should have_selector('h1', text: "Update post") }
it { should_not have_selector('span', text: "Published") }
it { should have_selector('span', text: "Draft") }
end
end
<p class="status">
<% if @post.status == "Draft" %>
Status: <span class="label"><%= @post.status %></span>
<% elsif @post.status == "Published" %>
Status: <span class="label label-primary"><%= @post.status %></span>
<% end %>
</p>
<p class="status">
<% if @post.status == "Draft" %>
Status: <span class="label"><%= @post.status %></span>
<% elsif @post.status == "Published" %>
Status: <span class="label label-primary"><%= @post.status %></span>
<% end %>
</p>
def update
@post = Post.find(params[:id])
if @post.update_attributes(params[:post]) && params[:commit] == "Publish"
@post.update_attributes(status: "Published")
flash[:success] = "Post updated."
redirect_to @post
elsif @post.update_attributes(params[:post]) && params[:commit] == "Save Draft"
@post.update_attributes(status: "Draft")
flash[:success] = "Post draft updated."
redirect_to @post
else
render 'edit'
end
end
def create
@post = current_user.posts.build(params[:post])
if @post.save && params[:commit] == "Publish"
@post.update_attributes(status: "Published")
flash[:success] = "Post published."
redirect_to @post
elsif @post.save && params[:commit] == "Save Draft"
@post.update_attributes(status: "Draft")
flash[:success] = "Post saved as draft."
redirect_to @post
else
render 'new'
end
end
虽然我不认为这是一个正确的答案,但我将建议您可以做一些事情来调试它 首先,如果您的页面按预期运行,那么这意味着问题与您编写测试的方式有关。我要做的第一件事是浏览你的页面完成任务,然后查看页面源代码并确保html标记匹配
should have_selector("tag", text: "whatever text is in your page source")
其次,我会确保您访问的页面是您想要访问的正确页面。快速搜索rake routes
并浏览浏览器中的每一页,然后将您想访问的正确页面与您想在测试中访问的页面进行比较
第三,你在考试的其他地方设置了题目吗?我在您提供的测试代码中没有看到它
由于我还有其他工作要做,我将在几个小时内深入研究您的代码。让我知道结果。我从没想过这会是个问题:
tag_list: "#{tag.id}") }
我必须这样做:
before do
tag_list: "#{tag.id}") }
click_button save_draft
visit edit_post_path(post)
end
正在使用
data
属性添加标记。因此,表单没有验证,'Published'
属性也没有更改。你能显示更新帖子状态的代码吗?@Paul Fioravanti好的,我发布了。请看我的编辑。谢谢你的帮助。我花了整整一个下午才弄明白这个问题。表单似乎没有验证,因为我没有在单击按钮保存草稿之前添加标记列表:“{tag.id}”)
。哇,有时候测试比编码耗费更多的时间。这是可以的,但是如果你打算把你的项目做大,从长远来看,测试会非常有帮助,原因显而易见。