如何测试 AJAX 在 rails 应用程序中加载的内容?

How to test content loaded by AJAX in rails app?

我有一个select,其内容是根据另一个select的select离子填充的。

我亲自使用验证了它是有效的。但是,我无法对其进行测试。

这是我的测试:

    @javascript
    When(/^I submit the form$/) do
        page.select @professor.name, from: 'Professor'
        page.fill_in 'title', with: "Test"
        page.fill_in 'content', with: "Test"
        sleep 5.seconds
        binding.pry
        page.click_button 'Submit'
    end

在pry session中,当我用page.find('#course').text查询select框的内容时returns ""。在测试中,未加载 select 框中的内容。

javascript很简单:

$(document).ready(function() {
  $('#professor').on('change', function() {
    id = $(this).find('option:selected').val();
    path = window.location.origin + '/professors/' + id + '/courses';

    $.ajax(path, {
      success: function(data, textStatus, jqXHR) {
        $('#course').empty();
        data.forEach(function(course) {
          $('#course').append(
            '<option value=' + course.id + '>'
            + course.identifier + ': ' + course.name
            + '</option>'
          );
        });
      }
    });
  });
});

在 ajax 测试中使用 sleep 是不可靠的。它会使您的测试套件变慢,并且不能保证它无论如何都会工作。

查看这篇文章https://robots.thoughtbot.com/automatically-wait-for-ajax-with-capybara

您应该检查页面是否存在所需元素的想法,如果它不存在,那么您应该再次等待一段时间(但不是 5 秒!)