Ruby on rails Rspec似乎通过了测试中应该失败的部分[Rails 4正在运行]

Ruby on rails Rspec似乎通过了测试中应该失败的部分[Rails 4正在运行],ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我正在使用由Bigg、Katz和Klabnik编写的Rails 4,就我个人而言,这是我第一次介绍rspec测试平台 我遇到的情况是,文本中指出的预期故障原因与我收到的故障消息不一致。事实上,我的失败似乎发生在后面的一行,这使我认为rspec正在通过应该失败的部分 文本期望测试拒绝的问题是失败/错误:单击链接“New Ticket”/NoMethodError:/yadda-yadda的未定义方法“tickets”。这是完全有意义的,因为我还没有将这个方法编码到tickets控制器中 相反,我收

我正在使用由Bigg、Katz和Klabnik编写的Rails 4,就我个人而言,这是我第一次介绍rspec测试平台

我遇到的情况是,文本中指出的预期故障原因与我收到的故障消息不一致。事实上,我的失败似乎发生在后面的一行,这使我认为rspec正在通过应该失败的部分

文本期望测试拒绝的问题是失败/错误:单击链接“New Ticket”/NoMethodError:/yadda-yadda的未定义方法“tickets”。这是完全有意义的,因为我还没有将这个方法编码到tickets控制器中

相反,我收到了一个与缺少“Title”字段和缺少“createticket”按钮相关的错误,如下面的代码所示,这是在对上述tickets方法进行rspec测试之后

提前感谢您的见解

现在到代码。。。如果还有其他的东西要我端上来,请告诉我

创建票据\u规范rb

<% title(@project.name, "Projects") %>

<h2><%= @project.name %></h2>

<%= link_to "Edit Project", edit_project_path(@project) %>

<%= link_to "Delete Project",
    project_path(@project),
    method: :delete, # This is intentionally listed as delete rather than the
    # standard destroy method of CRUD.
    data: { confirm:
              "Are you sure you want to delete this project?"
          } %>

<%= link_to "New Ticket", new_project_ticket_path(@project) %>

<!-- This is something I added on my own -->
</br>
<%= link_to "Home", projects_path %>
class TicketsController < ApplicationController

  before_action :set_project

  def new
    @ticket = @project.tickets.build
  end

  private
    def set_project
      @project = Project.find(params[:project_id])
    end

end
class Project < ActiveRecord::Base
  validates :name, presence: true
  has_many :tickets
end
Rails.application.routes.draw do
  root "projects#index"

  resources :projects do
    resources :tickets    
  end
end
在顶部,作为before操作的一部分,单击链接“New Ticket”

show.html.erb

<% title(@project.name, "Projects") %>

<h2><%= @project.name %></h2>

<%= link_to "Edit Project", edit_project_path(@project) %>

<%= link_to "Delete Project",
    project_path(@project),
    method: :delete, # This is intentionally listed as delete rather than the
    # standard destroy method of CRUD.
    data: { confirm:
              "Are you sure you want to delete this project?"
          } %>

<%= link_to "New Ticket", new_project_ticket_path(@project) %>

<!-- This is something I added on my own -->
</br>
<%= link_to "Home", projects_path %>
class TicketsController < ApplicationController

  before_action :set_project

  def new
    @ticket = @project.tickets.build
  end

  private
    def set_project
      @project = Project.find(params[:project_id])
    end

end
class Project < ActiveRecord::Base
  validates :name, presence: true
  has_many :tickets
end
Rails.application.routes.draw do
  root "projects#index"

  resources :projects do
    resources :tickets    
  end
end
bin/rake路由的终端输出

Running via Spring preloader in process 58481
             Prefix Verb   URI Pattern                                      Controller#Action
               root GET    /                                                projects#index
    project_tickets GET    /projects/:project_id/tickets(.:format)          tickets#index
                    POST   /projects/:project_id/tickets(.:format)          tickets#create
 new_project_ticket GET    /projects/:project_id/tickets/new(.:format)      tickets#new
edit_project_ticket GET    /projects/:project_id/tickets/:id/edit(.:format) tickets#edit
     project_ticket GET    /projects/:project_id/tickets/:id(.:format)      tickets#show
                    PATCH  /projects/:project_id/tickets/:id(.:format)      tickets#update
                    PUT    /projects/:project_id/tickets/:id(.:format)      tickets#update
                    DELETE /projects/:project_id/tickets/:id(.:format)      tickets#destroy
           projects GET    /projects(.:format)                              projects#index
                    POST   /projects(.:format)                              projects#create
        new_project GET    /projects/new(.:format)                          projects#new
       edit_project GET    /projects/:id/edit(.:format)                     projects#edit
            project GET    /projects/:id(.:format)                          projects#show
                    PATCH  /projects/:id(.:format)                          projects#update
                    PUT    /projects/:id(.:format)                          projects#update
                    DELETE /projects/:id(.:format)                          projects#destroy
rspec返回值

FF

Failures:

  1) Creating tickets Creating a ticket
     Failure/Error: fill_in "Title", with: "Non-standards compliance"
     Capybara::ElementNotFound:
       Unable to find field "Title"
     # ./spec/features/creating_tickets_spec.rb:13:in `block (2 levels) in <top (required)>'

  2) Creating tickets Creating a ticket without valid attributes fails
     Failure/Error: click_button "Create Ticket"
     Capybara::ElementNotFound:
       Unable to find button "Create Ticket"
     # ./spec/features/creating_tickets_spec.rb:21:in `block (2 levels) in <top (required)>'

Finished in 0.24689 seconds
2 examples, 2 failures

Failed examples:

rspec ./spec/features/creating_tickets_spec.rb:12 # Creating tickets Creating a ticket
rspec ./spec/features/creating_tickets_spec.rb:20 # Creating tickets Creating a ticket without valid attributes fails

Randomized with seed 33653
FF
失败:
1) 创建票证创建票证
失败/错误:在“标题”中填写“不符合标准”
Capybara::ElementNotFound:
找不到字段“标题”
#./spec/features/creating_tickets_spec.rb:13:in'block(2层)in'
2) 创建票证创建没有有效属性的票证失败
失败/错误:单击按钮“创建票据”
Capybara::ElementNotFound:
找不到“创建票证”按钮
#./spec/features/creating_tickets_spec.rb:21:in'block(2层)in'
以0.24689秒完成
2例,2次失败
失败的示例:
rspec./spec/features/creating_tickets_spec.rb:12#creating tickets creating a ticket
rspec./spec/features/creating_tickets_spec.rb:20#创建ticket创建没有有效属性的ticket失败
随机化种子33653

好的,首先,您得到的代码错误是正确的

在浏览器中浏览测试以查看实际发生的情况。。。您可以访问该链接,单击“Internet explorer”,然后单击“新建票证”按钮

有一个按钮叫它,所以当你这么做的时候,规范不会失败

浏览器将正确引导您进入标准Rails故障页面

rspec+capybara对这种情况没有问题-这在规范中不是一个例外。。。您确实需要在capybara中测试真实的错误页面-因此它们不会被视为规范的问题

这样想吧——如果我是水豚的一个自我意识的例子,我会想“是的,接下来我们将测试我们是否正确显示错误页面”;)

您在标题上失败的原因当然是错误页面没有包含名为title的字段的表单


所以。。。继续实施新的罚单方法并继续:)

我怀疑我这边有不一致的地方,所以我继续进一步研究我的问题。事实证明,我没有看到文本中提到的rspec返回的相同错误消息的原因是因为我将优秀的better_errors gem安装到了:development和:test组中


显然,在:test中运行这个gem时,它会在有机会循环到rspec+capybara之前劫持错误输出。一旦我将gem移到只作为:development组的一部分,测试结果就与参考文本以及我认为Taryn和Josh认为我看到的内容一致。

你能发布tickets/new.html.erb的源代码吗?在这个阶段,没有视图文件。这将在下一节5.1.4中介绍。展望未来,它将是一个表单部分,包含预期的标题和描述字段,以及一个提交按钮。明白了。所以发生的情况是,您的测试期望在单击“New Ticket”后出现一个表单。但由于该视图尚未创建,Rails可能会抛出一个错误页面。这就是为什么它无法找到您期望的字段/按钮。^^^^^大艾芬猜测。您可以通过将您的capybara驱动程序切换到selenium来验证这一点(您需要安装selenium驱动程序)"看着测试在浏览器中执行。很酷,我跟着你,谢谢你,Josh!我能想到的唯一一件事是,文本似乎认为规范将返回控制台中显示的错误消息…因为正如你和Taryn所说,这些返回的失败从未被编码。我怀疑作者是否认为,他们是r这是可以改变的,所以可能最好把它记为侥幸,然后继续。只要我对文本有正确的理由感到困惑,那么我很乐意继续!这个答案很模糊,我认为它在解决问题中所述的问题方面做得不好。所以我否决了它。不过,@consider6表示他找到了这个答案很有帮助,我将撤销投票。@Taryn East-有趣的是,我不知道spec!很好的解释!但有一点我很困惑…在这种情况下,什么会导致spec返回文本预期的错误消息?失败/错误:单击链接“New Ticket”/NoMethodError:/yadda-yadda的未定义方法“tickets”第二个规范预期会出现验证错误,这可能是由于提交无效表单造成的,当您单击“创建Ticket”时就是这种情况没有填写任何内容。有意义吗?@Taryn East-进一步说,问题可能是我混淆了应该输出什么规范吗?因为就像你说的,控制台确实显示请求通过了,但立即遇到了问题