Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何测试JQuery UI可排序';我的Rails应用程序中使用RSpec的控制器交互?_Ruby On Rails_Ajax_Testing_Jquery Ui Sortable_Rspec Rails - Fatal编程技术网

Ruby on rails 如何测试JQuery UI可排序';我的Rails应用程序中使用RSpec的控制器交互?

Ruby on rails 如何测试JQuery UI可排序';我的Rails应用程序中使用RSpec的控制器交互?,ruby-on-rails,ajax,testing,jquery-ui-sortable,rspec-rails,Ruby On Rails,Ajax,Testing,Jquery Ui Sortable,Rspec Rails,问题 问题是我知道正在调用控制器排序操作,并且它正在获取正确的参数来执行它的操作。当我通过UI进行测试时,我可以看到一切都在工作,但它不会为我的测试排序。我可以看到(在控制器操作中使用“puts”)散列被正确地发送到控制器操作,因此工作正常。问题是控制器的动作似乎根本不是。。。表演 问题 我如何测试这个?在我的规范中,我尝试在:post,:sort行之后插入一个“sleep 2”。您可以看到,我在该行前面添加了“xhr”,并且尝试在该行的末尾添加:format=>:js(未显示),但没有任何效果

问题

问题是我知道正在调用控制器排序操作,并且它正在获取正确的参数来执行它的操作。当我通过UI进行测试时,我可以看到一切都在工作,但它不会为我的测试排序。我可以看到(在控制器操作中使用“puts”)散列被正确地发送到控制器操作,因此工作正常。问题是控制器的动作似乎根本不是。。。表演

问题

我如何测试这个?在我的规范中,我尝试在:post,:sort行之后插入一个“sleep 2”。您可以看到,我在该行前面添加了“xhr”,并且尝试在该行的末尾添加:format=>:js(未显示),但没有任何效果

我在做什么

我正在使用jQueryUI的“可排序”插件在屏幕上的清单上对作业进行排序。它目前运行得很好,我可以通过改变屏幕上的顺序来“测试”这一点,然后刷新页面以查看所有内容现在都在正确的位置(刷新之前我刚刚将内容移动到的位置)。显然,这不是严格的测试,但到目前为止已经足够好了

现在,我正在添加一些逻辑来在后台复制/归档已排序的项目,并且我需要进行一些测试,以确保在进行排序时所有数据都被正确处理。旧的排序刷新检查测试方法在这里不起作用,因为有些东西发生在后台,而这些东西不会显示在屏幕上。在编写这些测试之前,我想为当前正在工作的设置编写测试,但无法通过测试

关于关联的注释

有作业、检查表和检查表JOB(联接表)。联接表具有“job_position”字段,该字段正在使用此排序进行更新。请参见下面的“代码”部分中的模型片段

用于执行此操作的资源

轨道3.2.11

ruby 1.9.3p374

rspec 2.13.1

宝石:测试

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
代码

job.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
Show.html.erb视图

<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>
检查表\u controller\u spec.rb-我知道这不是一个超级高效的空间用户,但我将所有内容分解成单独的行,以确保所有内容都设置正确

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
require'spec\u helper'
描述ChecklistsController做什么
登录管理
描述“后排序”是什么
上下文“不提交”是否执行
在做之前
@检查表=FactoryGirl.create(:检查表)
@job1=FactoryGirl.create(:job)
@job2=FactoryGirl.create(:job)
@job3=FactoryGirl.create(:job)
@job4=FactoryGirl.create(:job)

@checklist.jobs这是一个非常简单的答案:我在before块中构建的@attr数组是一个作业ID数组,应该是一个checklist\u作业ID数组

这:

应该是这样的:

@attr = [@cj4.id, @cj3.id, @cj2.id, @cj1.id]
哎呀

<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>
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
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
@attr = [@job4.id, @job3.id, @job2.id, @job1.id] 
@attr = [@cj4.id, @cj3.id, @cj2.id, @cj1.id]