У меня есть поле <textarea>
(атрибут модели Rails), для которого я должен проверить, отображается ли сообщение об ошибке разрешенной максимальной длины. Я должен сделать это, используя системную спецификацию с включенными Capybara, Selenium и т.п.
# model
class Model < ActiveRecord::Base
validates_length_of :description, maximum: 1000
end
# view
<label for = "description">Description</label>
<textarea maxlength = "1000" id = "description">Some text</textarea>
# RSpec
RSpec.describe "Model", type: :system do
it "should fail" do
visit edit_model_path(@model)
fill_in "Description", with: "abcdefghijklmnopqrstuvwxyz"*1000
# ...
end
end
Я пытался заполнить <textarea>
текстом длиннее 1000 символов, а также (maxlength = "1000"
) он вставляет в <textarea>
только первые 1000 символов текста, из-за чего я не могу проверить вывод сообщения об ошибке максимальной длины.
Я подумал, что один из способов проверить это — изменить атрибут maxlength
у <textarea>
прямо в примере RSpec, чтобы я мог заполнить его более чем 1000 символов, что позволит мне эффективно протестировать ошибку максимальной длины.
Можно ли с помощью RSpec Capybara, Selenium и им подобных изменить атрибут maxlength
?
Возможно, вам нужна проверка на стороне клиента.
@max Я знаю, что могу проверить это с помощью модели или спецификации запроса, но я четко отвечаю на свой вопрос об использовании системной спецификации. К вашему сведению (даже если я уверен, что вы уже это знаете). Пользователь может изменить DOM, чтобы изменить значение maxlength
.
Злонамеренный пользователь может делать намного больше вещей, чем вы когда-либо могли проверить с помощью системных спецификаций, так что это своего рода дурацкая затея. Системные спецификации хороши для тестирования приложения из пользовательской истории. Если вы чувствуете, что вам нужно прибегнуть к взлому реальной страницы, которую вы тестируете, только для того, чтобы использовать системную спецификацию, вы делаете это неправильно.
Итак, для вас, разве я не должен тестировать систему на maxlength
в моем случае?
Нет, если только вы не тестируете, что на самом деле делает maxlength, то есть усекает ввод после X символов. Базовая проверка на стороне сервера может быть протестирована другими способами. Если вы действительно хотите предоставлять индивидуальные отзывы пользователей (как в этом поле для комментариев), вы хотите использовать javascript, и это можно протестировать, используя Capybara с драйвером, который запускает реальный браузер. Чего вы не должны делать, так это манипулировать и изменять поведение страницы только для того, чтобы проверить проверку, которая находится там в качестве запасного варианта.
Это вполне возможно; Драйверы Capybara, такие как selenium или webkit, позволят вам запускать JS на странице. С Rack::Test вы можете редактировать страницу, на которой он работает с Nokogiri. Однако это не означает, что вы на самом деле должны.
Можете ли вы привести пример или ссылку на случай, если я захочу проверить свой случай, установив исправление обезьяны с помощью драйвера, например. Selenium (примечание: я никогда раньше этого не делал).
page.execute_script("document.getElementById('description').removeAttribute('maxlength')");
Спасибо @max, я хотел бы принять ваш ответ.
Я действительно даже не хочу писать это как ответ, потому что это не то, что я бы рекомендовал. Не стесняйтесь ответить на вопрос самостоятельно.
Вы можете попробовать скопировать/вставить более 1000 символов в поле, но вам действительно не стоит утруждать себя тестированием основных функций HTML. Предположим, что это сработает. Спросите своего БА, как вы должны проверить, введено ли более 1000 символов в поле, которое по определению не будет занимать более 1000 символов.
Основываясь на комментарии @max, вот способ (подходящий для тестирования) изменить атрибут maxlength
права <textarea>
в RSpec с помощью Selenium:
# RSpec
RSpec.describe "Model", type: :system do
it "should fail" do
# ...
page.execute_script("document.getElementById('description').removeAttribute('maxlength')");
# ...
end
end
Я бы просто проверил это с помощью модели или спецификации запроса. На самом деле нет смысла экспериментировать со страницей, которую вы тестируете, в спецификации системы, поскольку вы тестируете поведение приложения с точки зрения пользователя. Если пользователь даже не может ввести более 1000 символов, он никогда не увидит сообщение проверки.