0

В нашем приложении Rails, мы имеем следующие модели:Rails тест проверки, не проходящие

class User < ActiveRecord::Base 
    has_many :administrations, dependent: :destroy 
    has_many :calendars, through: :administrations 
end 

class Administration < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :calendar 
end 

class Calendar < ActiveRecord::Base 
    has_many :administrations, dependent: :destroy 
    has_many :users, through: :administrations 
end 

Мы попытались проверить модель администрирования с помощью следующего administration_test.rb тестового файла:

требуют «test_helper»

class AdministrationTest < ActiveSupport::TestCase 
    def setup 
    @user = users(:noemie) 
    @administration = Administration.new(user_id: @user.id, calendar_id: @calendar_id) 
    end 

    test "should be valid" do 
    assert @administration.valid? 
    end 

    test "user id should be present" do 
    @administration.user_id = nil 
    assert_not @administration.valid? 
    end 

    test "calendar id should be present" do 
    @administration.calendar_id = nil 
    assert_not @administration.valid? 
    end 

end 

Когда мы запускаем тест, мы получаем следующие результаты:

FAIL["test_calendar_id_should_be_present", AdministrationTest, 2015-06-30 07:24:58 -0700] 
test_calendar_id_should_be_present#AdministrationTest (1435674298.26s) 
     Expected true to be nil or false 
     test/models/administration_test.rb:21:in `block in <class:AdministrationTest>' 

FAIL["test_user_id_should_be_present", AdministrationTest, 2015-06-30 07:24:58 -0700] 
test_user_id_should_be_present#AdministrationTest (1435674298.27s) 
     Expected true to be nil or false 
     test/models/administration_test.rb:16:in `block in <class:AdministrationTest>' 

Мы как бы потеряны: это правильный путь к правильному тесту?

Если нет, то как мы должны писать? Если да, то как мы можем пройти?

ответ

0

Хорошо, мы нашли решение.

Мы обновили нашу модель администрирования следующим образом:

class Administration < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :calendar 

    validates :user_id, presence: true 
    validates :calendar_id, presence: true 

end 

А также редактировал наш administration_test.rb файл:

require 'test_helper' 

class AdministrationTest < ActiveSupport::TestCase 
    def setup 
    @user = users(:noemie) 
    @calendar = calendars(:one) 
    # This code is not idiomatically correct. 
    @administration = Administration.new(user_id: @user.id, calendar_id: @calendar.id) 
    end 

    test "should be valid" do 
    assert @administration.valid? 
    end 

    test "user id should be present" do 
    @administration.user_id = nil 
    assert_not @administration.valid? 
    end 

    test "calendar id should be present" do 
    @administration.calendar_id = nil 
    assert_not @administration.valid? 
    end 

end 

Тесты теперь проходит просто отлично.

+0

Хорошо, взгляните на мой ответ, хотя, потому что ваши тесты склонны к ложным срабатываниям. – max

1

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

belongs_to в ActiveRecord не добавляет проверки, макрос просто создает отношение.

Чтобы проверить соответствие, вы должны использовать validates_associated, который вызывает #valid? для каждой из связанных записей и validates_presence_of, чтобы убедиться в наличии соответствующей записи.

class Administration < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :calendar 
    validates_associated :user 
    validates :user, presence: true 
end 

При тестировании валидаций лучше писать на утверждения о хэш ошибок, поскольку assert_not @administration.valid? даст ложный положительный результат, если проверка не пройдена по любой другой причине.

Bad:

test "user id should be present" do 
    @administration.user_id = nil 
    assert_not @administration.valid? 
end 

Хорошо:

test "user id should be present" do 
    @administration.user_id = nil 
    @administration.valid? 
    assert @administration.errors.key?(:user) 
end 
Смежные вопросы