我正在测试以下内容:
- 用户创建一个帖子(新页面),然后他被重定向到显示页面(该帖子被保存为"Published")。
- 他进入编辑页面,点击"Save Draft"按钮,他再次被重定向到显示页面。
- 他再次进入编辑页面,现在他应该看到这样的内容:
<p>Status: <span>"Draft"</span></p>
(之前是<p>Status: <span>"Published"</span></p>
)
规范:
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>
该行为在活动页面中工作,但当我运行规范时,测试失败:
失败:
1)帖子页面显示页面帖子状态保存为草稿失败/错误:it {should have_selector('span', text: "Draft")}期望css "span"与文本"Draft"返回的东西#。/规范/要求/post_pages_spec。
2)帖子页面显示页面帖子状态保存为草稿失败/错误:it {should_not have_selector('span', text: "Published")}期望css "span"与文本"Published"不返回任何东西#。/规范/要求/post_pages_spec。
规范似乎找到了文本"Published"但没有"Draft"在span
标签内(它应该找到"Draft")。
点击按钮是否在错误的时间被触发?如何解决这个问题?
编辑: 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'
属性也没有改变。