- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题
问题是我知道正在调用 Controller 排序操作,并且它正在获取正确的参数来执行它的操作。当我通过 UI 进行测试时,我可以看到一切正常,但它不会为我的测试排序。我可以看到(在 Controller 操作中使用“puts”)哈希被正确地发送到 Controller 操作,所以它运行良好。问题是 Controller 的 Action 似乎根本就不是…… Action 。
问题
我如何测试它?我试过在我的规范中的 :post, :sort 行之后插入一个“sleep 2”。你可以看到我在该行的前面添加了“xhr”,并且我尝试在该行的末尾添加 :format => :js(未显示)但无济于事。
我在做什么
我正在使用 JQuery UI 的“可排序”插件对屏幕上的 list 上的作业进行排序。它目前运行良好,我可以通过更改屏幕上的顺序来“测试”它,然后刷新页面以查看现在所有内容都在正确的位置(我刚刚在刷新之前将内容移动到的位置)。显然,这不是严格的测试,但到目前为止已经足够好了。
现在,我正在添加一些逻辑来在后台复制/存档已排序的项目,并且我需要进行一些测试以确保在我进行排序时所有数据都得到正确处理。旧的排序-刷新-检查测试方法在这里不起作用,因为有些东西在后台发生,而且这些东西不会显示在屏幕上。在我编写这些测试之前,我想为当前工作的设置编写测试,但我无法让测试通过。
关联注意事项
有 Jobs、Checklists 和 ChecklistsJobs(连接表)。连接表具有使用这种排序更新的“job_position”字段。请参阅下面的“代码”部分中的模型片段。
用于执行此操作的资源
Railscast #147 Sortable Lists (revised)
rails 3.2.11
ruby 1.9.3p374
rspec 2.13.1
gem 在:测试
gem "rspec-rails", :group => [:test, :development]
group :test do
gem "factory_girl_rails", :require => false
gem "capybara"
gem "guard-rspec"
gem 'rb-fsevent', '~> 0.9'
end
代码
工作.rb
class Job < ActiveRecord::Base
scope :archived_state, lambda {|s| where(:archived => s)}
belongs_to :creator, :class_name => "Admin", :foreign_key => "creator_id"
has_many :checklists_jobs, :dependent => :destroy
has_many :checklists, :through => :checklists_jobs
.
.
.
end
list .rb
class Checklist < ActiveRecord::Base
scope :archived_state, lambda {|s| where(:archived => s) }
has_many :checklists_jobs, :dependent => :destroy, :order => 'checklists_jobs.job_position'#, :conditions => {'archived_at' => nil}
has_many :jobs, :through => :checklists_jobs
.
.
.
end
checklists_job.rb
class ChecklistsJob < ActiveRecord::Base
belongs_to :job
belongs_to :checklist
attr_accessible :job_position, :job_required
.
.
.
end
应用程序.js
$(function() {
$('ul[id^="sortable"]').sortable({
axis: 'y',
handle: '.handle',
update: function() {
return $.post($(this).data('update-url'), $(this).sortable('serialize'));
}
});
});
显示.html.erb View
<dd><ul class="unstyled" id="sortable" data-update-url="<%= sort_checklist_path(@checklist) %>">
<% @checklist.checklists_jobs.archived_state(:false).each do |cj| %>
<%= content_tag_for :li, cj do %><span class="handle"><i class="icon-move btn btn-mini"></i></span> <strong><%= cj.job.name %></strong><% if cj.job.description? %> - <%= cj.job.description %><% end %>
<% end %>
<% end %>
</ul></dd>
checklists_controller.rb
def sort
@checklist = Checklist.find(params[:id])
params[:checklists_job].each_with_index do |id, index|
@checklist.checklists_jobs.update_all({job_position: index+1}, {id: id})
end
render nothing: true
end
checklists_controller_spec.rb - 我知道这不是 super 高效的空间用户,但我将所有内容分解成单独的行以确保我正确设置了所有内容。
require 'spec_helper'
describe ChecklistsController do
login_admin
describe "POST sort" do
context "with no submission" do
before do
@checklist = FactoryGirl.create(:checklist)
@job1 = FactoryGirl.create(:job)
@job2 = FactoryGirl.create(:job)
@job3 = FactoryGirl.create(:job)
@job4 = FactoryGirl.create(:job)
@checklist.jobs << [@job1, @job2, @job3, @job4]
@checklist.save
@cj1 = @checklist.checklists_jobs.find_by_job_id(@job1.id)
@cj2 = @checklist.checklists_jobs.find_by_job_id(@job2.id)
@cj3 = @checklist.checklists_jobs.find_by_job_id(@job3.id)
@cj4 = @checklist.checklists_jobs.find_by_job_id(@job4.id)
@cj1.job_position = 1
@cj2.job_position = 2
@cj3.job_position = 3
@cj4.job_position = 4
@cj1.save
@cj2.save
@cj3.save
@cj4.save
@attr = [@job4.id, @job3.id, @job2.id, @job1.id]
end
# format of the params hash that's being passed:
# {"checklists_job"=>["545", "544", "546", "547"], "id"=>"124"}
it "sorts the checklist's checklists_jobs" do
xhr :post, :sort, { :id => @checklist.id, :checklists_job => @attr }
@checklist.reload
# The test fails on the next line
@checklist.checklists_jobs.find_by_job_id(@job1.id).job_position.should == 4
end
end
end
end
测试结果 - 请注意,我在上面的规范中标记了失败的行
Failures:
1) ChecklistsController POST sort with no submission sorts the checklist's checklists_jobs
Failure/Error: @checklist.checklists_jobs.find_by_job_id(@job1.id).job_position.should == 4
expected: 4
got: 1 (using ==)
# ./spec/controllers/checklists_controller_spec.rb:394:in `block (4 levels) in <top (required)>'
Finished in 2.59 seconds
51 examples, 1 failure
Failed examples:
rspec ./spec/controllers/checklists_controller_spec.rb:391 # ChecklistsController POST sort with no submission sorts the checklist's checklists_jobs
最佳答案
这是一个非常简单的答案:我在 before block 中构建的 @attr 数组是一个作业 ID 数组,应该是一个 checklists_job id 数组。
这个:
@attr = [@job4.id, @job3.id, @job2.id, @job1.id]
应该是这样的:
@attr = [@cj4.id, @cj3.id, @cj2.id, @cj1.id]
糟糕。
关于ruby-on-rails - 如何使用 RSpec 在我的 Rails 应用程序中测试 JQuery-UI Sortable 的 Controller 交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16040905/
我想知道 Rspec 中的命令式和声明式步骤是什么。 这是 Rspec 书中的示例代码: Scenario: transfer money (declarative) Given I have $10
我正在尝试使用 Travis 设置 CI。但是我遇到了在 Travis 上失败但在本地没有的测试,甚至提供了相同的种子。 我认为种子运行相同,但现在我不确定,并想弄清楚它是否存在,所以我现在在哪里看。
RSpec 的文档提到了 --bisect option ,当运行时提供最小的复制,例如 rspec ./spec/calculator_10_spec.rb[1:1] ./spec/calculat
我有一些昂贵的测试设置,仅对我的规范中的少数示例是必需的,如果需要,它只需要运行一次。因为它很慢,所以我试图避免将它放在 before(:each) block 中,但 before(:all) 似乎
在我的 Gemfile 中 gem 'rspec-rails', '~> 3.3' 我发现,errors_on 匹配器移动到了另一个 gem:https://github.com/rspec/rspe
如果我运行此命令“rspec ./spec/requests/api/v1/password_reset_request_spec.rb”,此文件中的所有测试都会通过。 但是,当我运行“rspec”时
我花了 4 天时间尝试正确安装 Ruby on Rails,但我遇到了一个大问题。我第一次使用Linux(对我来说更舒服),但遇到问题后,我使用了Windows。令我惊讶的是,我在 Windows 上
我在这样的验证中测试了很多坏字符串: ['0', '3:a', 'xx:11', '-1', '-3:00', 'h', 'h2', 'h2h', 'm', 'm10', 'm10m', '2hm',
我的测试套件中有一部分运行着一堆非常慢的导入器。这些测试不需要经常运行(除非实际上正在处理导入器)所以我使用 Rspec 标签将它们分开:http://relishapp.com/rspec/rspe
Rspec 尝试在运行任何规范文件或整个测试套件结束时运行 Test::Unit 测试。它仍然没关系,因为我没有任何测试单元测试文件,但它尝试传递给 rspec 的命令行选项,因为它们将传递给 Tes
我有一段代码要测试: class User :destroy end 请举例测试关联代码的RSpec代码。 最佳答案 对我来说,这个变体效果很好: describe User do it { s
我正在尝试在 rails Controller 规范中重用一些通用代码。我对管理员用户和普通用户有不同的上下文。但是,对于特定操作,大部分行为是相同的,因此我尝试将这种常见行为提取到辅助函数中: de
我有两个类OneClass和 AnotherClass : class OneClass def initialize(*args) @another_member = AnotherCl
我有一个看起来像这样的模型: class Gist def self.create(options) post_response = Faraday.post do |request|
我是 RSPEC 的新手。我编写了一个名为 result_spec.rb 的 RSPEC 代码,如下所示: describe '#grouped_scores' do subject { result
我对字符串类进行了如下扩展: class String def last_character self[-1] end end 我将 string.rb 文件放在 lib 中,如下所示
我是 RSpec 的新手,我在其中编写了一个测试场景: my_object.should_not be_valid 它工作正常。但是,我想测试模型的特定属性是否无效。这样的 RSpec 行为是现成的吗
我正在尝试测试邮政编码属性的长度以确保其长度为 5 个字符。现在我正在测试以确保它不是空白,然后是 4 个字符太短,6 个字符太长。 有没有办法测试它是否正好是 5 个字符?到目前为止,我在网上或 r
我将rspec与电子邮件规范gem一起使用。我正在尝试做: last_delivery = ActionMailer::Base.deliveries.last last_delivery.body.
我创建了一个新的 rails 应用程序,并按照此处的 rspec-rails 安装说明进行操作 - https://github.com/rspec/rspec-rails然后我在我的 app/lib
我是一名优秀的程序员,十分优秀!