#ruby-on-rails #ruby #minitest
Вопрос:
Я начинаю заниматься тестированием с помощью minitest в Rails. В настоящее время мой первый тест, чтобы убедиться, что моя модель верна, возвращает значение false. Само сообщение об ошибке также является очень общим Expected false to be truthy
. Я протестировал все остальное, и все эти тесты работают нормально. Кто-нибудь знает, что может быть причиной этого?
article_test.rb
require 'test_helper'
class ArticleTest < ActiveSupport::TestCase
def setup
@article = Article.new(title:"Avengers Endgame", body:"I am inevitable")
end
test "article should be valid" do
assert @article.valid?
end
test "title should be present" do
@article.title = " "
assert_not @article.valid?
end
test "body should not be too short" do
@article.body = "aa"
assert_not @article.valid?
end
end
статья.рб
class Article < ApplicationRecord
include Visible
belongs_to :user
has_many :comments, dependent: :destroy
has_rich_text :body
validates :title, presence: true
validates :body, presence: true, length: { minimum: 10 }
end
Ответ №1:
Основная проблема здесь заключается в том, что вы используете плохой метод проверки своих подтверждений.
assert @article.valid?
и assert_not @article.valid?
на самом деле ничего не говорит вам о тестируемом объекте. Когда тест проваливается, вы ничего не знаете о том, почему он на самом деле провалился и действительно ли сбой связан с тем, что вы якобы тестируете. В лучшем случае это служит своего рода лакмусовой бумажкой, подтверждающей правильность вашей настройки теста.
Вместо этого подхода «ковровой бомбардировки» проверьте каждую проверку самостоятельно:
class ArticleTest < ActiveSupport::TestCas
test "title should be present" do
article = Article.new(title: '')
article.valid?
assert_includes build_article.errors[:title], "can’t be blank"
end
test "body should not be too short" do
article = Article.new(body: 'aa')
article.valid?
assert_includes article.errors[:body], "is too short"
end
end
Тестирование всех проверок сразу (создание записи с допустимыми входными данными) в любом случае будет охватываться вашими интеграционными и системными тестами.
Комментарии:
1. Хорошо, это имеет смысл, спасибо, тогда я попробую этот маршрут.
2. gorails.com/episodes/testing-rails-validations
3. Драгоценный камень shoulda-matchers также очень хорош для того, чтобы сделать валидационное тестирование намного менее утомительным.
Ответ №2:
У вас есть belongs_to :user
, который ожидает @article
, что a user_id
обязательно будет присутствовать, прежде чем его можно будет сохранить.
Если user_id
это необязательно во время создания, измените это:
belongs_to :user
Для
belongs_to :user, optional: true
Комментарии:
1. Я не уверен, что хочу этого делать. Я использую devise для аутентификации, и я боюсь, что это сломает само приложение, а не только тесты, которые я пытаюсь выполнить.
2. @Jasper: хорошо, тогда назначьте пользователя для этой статьи.
3. @Jasper зависит от вашей цели и намерения. Если ваше намерение состоит в том, что an
@article
может быть действительным безuser_id
этого, вам нужно создать его как необязательную ассоциацию. Если нет, то либо вы утверждаете, что@artcile
это неверно, либо назначаете пользователя статье.