Ошибка RSpec, поскольку экранируется URL - PullRequest
0 голосов
/ 21 сентября 2018

Перемещение RSpec в проекте Rails с использования Poltergeist на использование Selenium (Webdriver) Chrome, и теперь у меня возникают некоторые сбои, которых я не ожидал.Похоже, он пытается уйти от URL по какой-то причине?Мысли?

Failures:

  1) Story editing private story should be read after editing
     Failure/Error: expect(story_cover_image).to eq "#{url}/convert?rotate=exif"

       expected: "http://placehold.it/edited.png/convert?rotate=exif"
            got: "\"http://placehold.it/edited.png/convert?rotate=exif\""

       (compared using ==)

Вот спецификация (удалено, что не имеет значения):

feature 'Story editing', type: :feature, js: true do
  ...
  let(:story_attributes) do
    {
      ...
      cover_image: {
        url: 'http://placehold.it/edited.png'
      }
    }
  end

  ...

  def fill_file_url(url)
    execute_script <<-JS
      angular.element(".content").scope().story.addCoverImage();
      angular.element(".content").scope().story.coverImage.url = "#{url}";
      angular.element(".content").scope().story.save();
    JS

    expect(story_cover_image).to eq "#{url}/convert?rotate=exif"
  end

  ...

  def fill_in_story_form(story)
    fill_file_url story[:cover_image][:url] if story[:cover_image]
  end

  ...

  context 'private' do
    scenario 'story should be read after editing' do
      fill_in_story_form story_attributes            <<<<<< SPEC FAILS ON THIS LINE >>>>>
      ...
    end
  end

РЕДАКТИРОВАТЬ Новый сбой после изменения "#{url}" на #{url} согласнозапрос:

Также пробовал: angular.element(".content").scope().story.coverImage.url = url;

  1) Story editing private story should be read after editing
     Failure/Error:
           execute_script <<-JS
             angular.element(".content").scope().story.addCoverImage();
             angular.element(".content").scope().story.coverImage.url = #{url};
             angular.element(".content").scope().story.save();
           JS

     Selenium::WebDriver::Error::UnknownError:
       unknown error: Runtime.evaluate threw exception: SyntaxError: Unexpected token :
         (Session info: chrome=69.0.3497.100)
         (Driver info: chromedriver=2.41.578706 (5f725d1b4f0a4acbf5259df887244095596231db),platform=Mac OS X 10.13.6 x86_64)

1 Ответ

0 голосов
/ 21 сентября 2018

Проблема в этой строке:

angular.element(".content").scope().story.coverImage.url = "#{url}";

Поскольку внутри HEREDOC все считается строкой #{url} - это все, что вам нужно для интерполяции строк.Но в этом случае вы хотите, чтобы интерполяция рассматривалась как строка Javascript, поэтому вы должны использовать '#{url}'.Выполнение "#{url}" создает экранированные двойные кавычки, потому что по умолчанию HEREDOC следует правилам двойных кавычек , поэтому вы должны изменить все ваши двойные кавычки на одинарные кавычки внутри HEREDOC.

Попытка сделать это напрямуюв консоли IRB вы получите:

url = "https://www.google.com"
<<-JS
  angular.element('.content').scope().story.coverImage.url = '#{url}';
JS
=> "angular.element('.content').scope().story.coverImage.url = 'https://www.google.com';\n";

<<-JS
  angular.element(".content").scope().story.coverImage.url = '#{url}';
JS
=> "angular.element(\".content\").scope().story.coverImage.url = 'http://www.google.com';\n"

Правила цитирования документов Heredoc

...