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}”)
    。哇,有时候测试比编码耗费更多的时间。这是可以的,但是如果你打算把你的项目做大,从长远来看,测试会非常有帮助,原因显而易见。