RSpec测试查询无法按预期工作,但代码/控制台工作正常

时间:2015-05-08 18:17:34

标签: ruby-on-rails rspec

这是我的情景。我有一个测试添加评论的票务应用程序。我有一个creation_comments_spec设置,用于创建用户,创建项目并创建票证,让Pundit为其分配权限,然后进行访问。标准的东西。

这是我困惑的地方。

在我的“show”页面上,我为这个新创建的票证有以下控制器操作:

class StaticPagesController < ApplicationController
  skip_after_action :verify_authorized, only: [:home]  


  def home
    @inactive_projects = Project.includes(:tickets).where(tickets: { project_id: nil} )

   @open_projects = Project.includes(tickets: :state).where.not({ states: { name: "Closed" } })
   @projects = Project.all
  end
end

在我的展示页面上,我循环浏览@inactive_projects并显示指向project.name的链接。我为@open_projects做同样的事情。为了测试,我是为@projects做的。

在RSPEC中,Capybara唯一展示的是@projects = Project.all集合。其他两个回来都是空的。如果我在let中创建这些!阻止所有事情,或使用Project.create!和Ticket.create!之前,在任何情况下,出现的唯一事情是@projects = Projects.all。

这告诉我,在某些方面我的查询没有发现那里的项目,但它应该是第一个找到没有票证的所有项目,第二个查找所有没有关闭的票据的项目。 / p>

在我的浏览器中一切正常。

在rails控制台中,我可以将所有这些放入并创建它就像测试一样,一切正常。仅在RSpec中,Capybara表示它没有通过我想要的任何一个系列找到任何东西。

我可以投入更多,但正如我所说,我已经调整了我的测试以完成一百万种不同的事情。在所有情况下出现的唯一的事情是@projects = Project.all和NOTHING else EVER。但是在浏览器和控制台中它都可以工作。

根据下面的评论,这是我的规格:

require "rails_helper"

RSpec.feature "Users can comment on tickets" do
  let!(:user) { FactoryGirl.create(:user) }
  let!(:project) { FactoryGirl.create(:project) }
  let!(:ticket) { FactoryGirl.create(:ticket, project: project, author: user) }
  
  before do
    login_as(user)
    assign_role!(user, :manager, project)
    FactoryGirl.create(:state, name: "Open")
    
    visit "/"
    click_link project.name
  end
  
  scenario "with valid attributes" do
    click_link ticket.title
    fill_in "Text", with: "Added a comment!"
    click_button "Create Comment"
    
    expect(page).to have_content("Comment has been created.")
    within("#comments") do
      expect(page).to have_content("Added a comment!")
    end
  end
  
  scenario "with invalid attributes" do
    click_link ticket.title
    click_button "Create Comment"
    
    expect(page).to have_content("Comment has not been created.")
  end
  
  scenario "when changing a ticket's state" do
    click_link ticket.title
    fill_in "Text", with: "This is a real issue"
    select "Open", from: "State"
    click_button "Create Comment"
    
    expect(page).to have_content("Comment has been created.")
    within("#ticket .state") do
      expect(page).to have_content("Open")
    end
    
    
      expect(page).to have_content("state changed to Open")
   
  end
  
  scenario "but cannot change the state without permission" do
    assign_role!(user, :editor, project)
    
    visit project_ticket_path(project, ticket)
    expect(page).not_to have_select("State")
  end
  
  scenario "when adding a new tag to a ticket" do
    visit project_ticket_path(project, ticket)
    
    expect(page).not_to have_content("bug")
    
    fill_in "Text", with: "Adding the bug tag"
    fill_in "Tags", with: "bug"
    click_button "Create Comment"
    
    expect(page).to have_content("Comment has been created.")
    within("#ticket #tags") do
      expect(page).to have_content("bug")
    end
  end
end

3 个答案:

答案 0 :(得分:0)

您没有看到任何打开的项目的原因可能是因为您的测试设置中没有任何内容。

您的控制器包含以下代码:

@open_projects = Project.includes(tickets: :state).where.not({ states: { name: "Closed" } })

所以,你应该有一个project,它与至少一个ticket相关联。该票证应与至少一个state相关联,该名称​​不是 Closed。我没有在你的规范中看到任何地方。

您已经创建了userproject,您已与第6行创建的ticket相关联。state虽然在哪里?

您确实在before区块中创建了一个州:

FactoryGirl.create(:state, name: "Open")

但据我所知,它与您之前创建的ticket无关。

您没有看到任何非活动项目的原因是(据我所见),因为您没有ticket而没有project。所以,要解决这个问题,你可以试试这个:

let!(:ticket_without_project) { FactoryGirl.create(:ticket, author: user) }

答案 1 :(得分:0)

我建议使用pry gem并将调用转发给&#34; binding.pry&#34;在您的规范中,您可以在正在设置的环境中逐行运行您的规范。我发布的内容并不重要。

答案 2 :(得分:0)

这是我的确切问题,我认为你已经弄明白了,但对我来说,问题是我刚刚更改了某些模型的迁移文件。 Rails从来没有抱怨过,但是在我回滚并迁移测试数据库之后我的问题就解决了,你可以这样做:

rake db:rollback testrake db:migrate test

您可能需要回滚x个步骤,如rake db:rollback STEP=15 test