Ruby on rails Rspec似乎通过了测试中应该失败的部分[Rails 4正在运行]
我正在使用由Bigg、Katz和Klabnik编写的Rails 4,就我个人而言,这是我第一次介绍rspec测试平台 我遇到的情况是,文本中指出的预期故障原因与我收到的故障消息不一致。事实上,我的失败似乎发生在后面的一行,这使我认为rspec正在通过应该失败的部分 文本期望测试拒绝的问题是失败/错误:单击链接“New Ticket”/NoMethodError:/yadda-yadda的未定义方法“tickets”。这是完全有意义的,因为我还没有将这个方法编码到tickets控制器中 相反,我收到了一个与缺少“Title”字段和缺少“createticket”按钮相关的错误,如下面的代码所示,这是在对上述tickets方法进行rspec测试之后 提前感谢您的见解 现在到代码。。。如果还有其他的东西要我端上来,请告诉我 创建票据\u规范rbRuby 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控制器中 相反,我收
<% 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-进一步说,问题可能是我混淆了应该输出什么规范吗?因为就像你说的,控制台确实显示请求通过了,但立即遇到了问题