Прежде всего, вы пишете тесты действительно неэффективным способом. Если вы не хотите проверять валидации, вам не нужно тестировать возвращаемое значение метода save
, а только значение метода valid?
И хеш errors
.
RSpec.describe Profile, type: :model do
context 'validation tests' do
it 'ensures user_id presence' do
profile = Profile.new(platform: 0, region: 0, tag: 'GamerTag', sr: 1600, user_id: nil) #you should be explicit with the user_id value being nil, tests should be explicit, it may seem unnecesary but it makes them easier to read
expect(profile).to be_invalid #or expect(profile).not_to be_valid
expect(profile.errors[:user_id]).to be_present #you could test the actual message too, not just the presence on any error
end
end
end
Этот тест фактически проверяет только проверки, а также гарантирует наличие ошибки в поле user_id
.
С вашим настоящим тестом вы не можете знать, что на самом деле мешает сохранить объект. Это может быть что угодно: другая проверка, обратный вызов before_save, возвращающий false, недопустимое значение при вставке в базу данных, что угодно. Он также медленнее, поскольку фактически должен записывать запись в базу данных, тестирование valid?
выполняется в памяти, что намного быстрее.
Я бы рекомендовал вам прочитать о FactoryBot, чтобы вам не приходилось повторять Profile.new....
при каждом тесте.
Если вы все еще хотите проверить возвращаемое значение save
в последнем тесте, вы должны знать, ПОЧЕМУ оно не сохраняется, вы можете использовать save!
, который вызывает исключение вместо возврата false для отладки вашего кода, и вы также можете проверить profile.errors.full_messages
на наличие ошибок, которые вы не учитывали при настройке теста.