проверка, является ли элемент «кликабельным» в HyperSpec - PullRequest
5 голосов
/ 11 апреля 2019

У меня есть компонент Hyperstack, такой как:

      render do
        LI(class: class_names, title: conflicts || '',
           data: { toggle: :tooltip, placement: 'auto left', container: :body }) do
          DIV(class: 'row paper-row') do
            DIV(class: 'col-sm-12 text-left') do
              P(class: 'medium-weight', id: 'tp_envelopes') { params.envelope.name }
            end
          end
        end.on(:click) { select_envelope }
      end

Я хочу, чтобы обработчик on (: click) был условным, если метод conflicts возвращает ненулевое значение.

Мне также интересно, как я могу проверить это в HyperSpec / Capaybara ... то есть, как я могу проверить, отвечает ли элемент HTML на событие: click?

Ответы [ 4 ]

3 голосов
/ 11 апреля 2019

Вы можете условно отключить / включить обработчик кликов, используя

end.tap { |item| item.on(:click) { select_envelope } unless conflicts }

заменить

end.on(:click) { select_envelope }
2 голосов
/ 11 апреля 2019
end.on(:click) { select_envelope }

Вы можете заменить (:click) на:

(!conflicts && :click)

Это работает, потому что, если конфликты не равны нулю, это приведет к тому, что обработчик нулевого щелчка ничего не сделает.

1 голос
/ 11 апреля 2019

Хороший способ сохранить код в чистоте - просто вернуться внутрь метода, вызванного в событии:

def select_envelope
  return if conflicts

  ...
end

# this keeps the event handler the same
end.on(:click) { select_envelope }

При этом всегда будет происходить незначительное снижение производительности из-за необходимости всегда запускать событие, но всегда естьдебаты производительности против читабельности.

1 голос
/ 11 апреля 2019

Я не уверен, что проверка элемента на событие щелчка будет надежной из-за всплытия событий.

Я бы написал тест, чтобы щелкнуть по элементу, а затем ожидать, что какая-либо логика в событии щелчка не произойдет.

conflicts = true

element.click() # trigger select_envelope

expect(selected_envelope).to be_nil # no envelope should be selected due to conflicts
...