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 在Capybara测试期间调用Coffeescript_Ruby On Rails_Ajax_Coffeescript_Capybara - Fatal编程技术网

Ruby on rails 在Capybara测试期间调用Coffeescript

Ruby on rails 在Capybara测试期间调用Coffeescript,ruby-on-rails,ajax,coffeescript,capybara,Ruby On Rails,Ajax,Coffeescript,Capybara,我的应用程序有很多不同的地方,当用户单击按钮/link/div时,我通过调用ajax函数来更新数据库。我需要在测试中包括这些功能,但我对水豚的了解还不够 下面是我想要测试的一个div的示例,关联的ajax调用,以及我想要通过的测试。我应该补充一点,我是通过Cloud9IDE构建的,以防万一这会有所不同 查看 <% @seminar.students.order(:last_name).in_groups_of(6).each do |group| %> <div cla

我的应用程序有很多不同的地方,当用户单击按钮/link/div时,我通过调用ajax函数来更新数据库。我需要在测试中包括这些功能,但我对水豚的了解还不够

下面是我想要测试的一个div的示例,关联的ajax调用,以及我想要通过的测试。我应该补充一点,我是通过Cloud9IDE构建的,以防万一这会有所不同

查看

<% @seminar.students.order(:last_name).in_groups_of(6).each do |group| %>
    <div class="row">
        <% group.each do |student| %>
            <% if student %>
               <% this_ss = @seminar.seminar_students.find_by(:user => student) %>
                  <% if this_ss.present %>
                       <% thisClass = "col-md-2 seat clickySeat" %>
                       <% thisText = "Present" %>
                  <% else %>
                       <% thisClass = "col-md-2 seat clickySeat absent" %>
                       <% thisText = "Absent" %>
                  <% end %>
                  <div class = "<%= thisClass %>" id="<%= this_ss.id %>" name="ss_<%= this_ss.id %>">
                      <%= student.first_plus_init %><br/>
                      <p class="presentTag"><%= thisText %></p>
                  </div>
               <% end %>
         <% end %>
    </div>
<% end %>
测试

if $('.clickySeat').length > 0
    $('.clickySeat').on "click", ->
        this_tag = $(this).find(".presentTag")
        seminar_student_id = $(this).attr('id')
        url = '/seminar_students/'+seminar_student_id
        if this_tag.text() == "Absent"
            attendance = true
            $(this).removeClass("absent")
            this_tab.text("Present")
        else
            attendance = false
            $(this).addClass("absent")
            this_tab.text("Absent")
        $.ajax
            type: "PUT",
            url: url,
            dataType: "json"
            data:
                seminar_student:
                    present: attendance
test "attendance with click" do
    @ss = @student_3.seminar_students.find_by(:seminar => @seminar)
    assert @ss.present

    capybara_login(@teacher_1)
    click_on("desk_consult_#{@seminar.id}")
    click_on("#{new_consultancy_button_text}")
    find("##{@ss.id}").click

    assert_not @ss.present
    click_on("Create Desk Consultants Groups")
end

在开发和生产中,div和ajax正在努力切换数据库中标记为缺席/在场的学生。但在测试中,assert_not@ss.present行失败。这就是我试图在任何地方修复的模式:我的capybara测试都没有调用任何javascript

我已经阅读了一些类似的问题和相关的文章。到目前为止,我已经尝试了所有我读过的建议,比如添加SeleniumWebKitGem,这样我就可以使用Capybara.javascript-driver=:selenium行。到目前为止,我遇到的任何解决方案都不适合我

提前感谢您提供的任何见解

您可以尝试该驱动程序并更改配置以使用它。不要忘记在您的路径上安装PhantomJS(您可以使用以下命令安装它:
npm install-g PhantomJS

您应该在测试的某个部分添加
js:true
,我只是不记得在哪里。但是,您可以搜索它。=]


祝你好运。

运行JS的测试通常不是两个问题中的一个,而且测试中还有两个问题可能会导致失败

对于JS问题,第一个原因可能是您的一个JS资产中有一个错误,导致它们在连接在一起时无法处理。因为您声明它在生产模式下工作(在生产模式下也会发生连接)我们应该能够排除这种情况。第二个原因可能是您没有使用支持JS的驱动程序运行。请确保您遵循自述文件中的说明——从ActionDispatch::IntegrationTest派生测试类,并且该部分的最后一部分(其中Capybara.current\u driver=Capybara.javascript\u driver)在任何需要JS的测试之前运行。(如果您希望所有测试都使用JS支持运行,您可以在设置Capybara.javascript\u驱动程序后设置Capybara.default\u driver=Capybara.javascript\u driver)。如果使用Rails<5.1,您可能还需要安装和配置数据库\u cleaner-请参阅

这会让你的测试运行在一个JS驱动程序上——除此之外- 第一:调用
find(…)时。单击
不保证等待由单击导致的任何操作完成。这意味着您需要设置断言(水豚提供的断言之一,因为它们具有等待/重试行为)获取由单击触发的可见更改,以确保在尝试从数据库访问元素之前已完成该更改。
第二:因为您已经加载了
@ss
,所以在重新加载对象之前,它不会反映DB状态的变化

这意味着您的测试需要按照

test "attendance with click" do
  @ss = @student_3.seminar_students.find_by(:seminar => @seminar)
  assert @ss.present

  capybara_login(@teacher_1)
  click_on("desk_consult_#{@seminar.id}")
  click_on("#{new_consultancy_button_text}")
  find("##{@ss.id}").click
  assert_text("You are marked as absent") # An assertion for whatever visible change occurs due to the previous click which will delay the next statement until the app has completed processing
  assert_not @ss.reload.present # Need to reload the object to see any DB changes
  click_on("Create Desk Consultants Groups") 
end

经常需要重新加载对象是不赞成对DB对象进行断言的部分原因,您应该主要测试UI行为/更改(在功能测试中)

你不会告诉我们你想要通过的测试有什么实际失败的地方。另外,当你设置
Capybara.javascript\u驱动程序时,它只被指定使用支持javascript的驱动程序的测试使用。请参阅-。你应该能够知道它是否使用selenium,因为它通常会打开Firefox或Chrome的实例(取决于您的配置).Aha.说得好。测试在assert_not@ss.present行失败。在开发和生产中,单击div更新数据库以在缺席和在场之间切换学生。在测试中,什么都没有发生。这是我尝试在任何地方修复的模式:我的水豚鱼测试都没有调用任何javascript。
js:true
o仅在使用RSpec时有效——OP似乎在使用minitest。如果我能弄清楚如何安装phantomjs,它会与minitest一起工作吗?使用Cloud9 IDE会有所不同吗?我想我已经实现了你的所有建议。现在,测试文件中的代码似乎无法访问Fixture。如果我放置“debugger”在测试文件中,User.count返回零。(这是因为数据库_cleaner“清理”了所有数据吗?)为了解决这个问题,我尝试在测试开始时创建一个新教师。不幸的是,这个新创建的教师无法登录。当“调试器”出现时放置在我的sessions_控制器中,User.count返回装置中的所有124个用户。但它不包括我在测试中创建的教师。当我在没有清洁器的情况下尝试时,会出现以下错误:ActiveRecord::StatementInvalid:SQLite3::BusyException:数据库已锁定:@JeffZivkovic您尚未澄清您使用的Rails版本g、 但是如果使用<5.1(5.1+中不需要数据库_清洁器)如果您无法访问在测试中创建的记录,那么这很可能意味着您在运行支持JS的测试时没有正确启用database_cleaner使用截断或删除模式,而是仍然使用事务模式。太好了!是的。database_cleaner策略是关键。尽管所需的策略是你的建议的诗句。唯一让我的考试变绿的策略是“交易”。但是这个策略似乎已经消除了在考试中创建新老师的需要。我感谢你在过去几天里不断的帮助。祝你假期愉快!