Rails minitest, почему моя модель статьи недействительна?

#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 это неверно, либо назначаете пользователя статье.