2015-04-14 5 views
0

У меня проблема с моими Rails Tests. У меня есть модель Новости и модели Tag, которые имеют HABTM Отношения Новости Модель:Метод испытания всегда утверждают

class News < ActiveRecord::Base 
    has_and_belongs_to_many :tags 

    validates :name, presence: true, length: { minimum: 4 } 
    validate :has_tags? 

    private 

    # Validates presence of tags 
    def has_tags? 
     errors.add(:tags, ": News must have some tags.") if self.tags.blank? 
    end 

испытаний Модель:

class Tag < ActiveRecord::Base 
    has_and_belongs_to_many :news 

    validates :name, presence: true 

я написал тест для проверки has_tags:

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

    test "news should have tags" do 
    assert_not @news.tags.blank? 
    end 

Мои новости Светильники:

news1: 
    name: Newstest 
    tags: 

Tag Светильники:

one: 
    name: Music 

two: 
    name: Movie 

Когда я запускаю тест грабли: модели, два теста терпят неудачу, что это правильно. И когда я добавляю тег в новостную ленту и снова запускаю тест, тест проходит.

news1: 
    name: Newstest 
    tags: one 

Но когда я удаляю тег в приборе и запускаю тест рейка: модели снова, тесты проходят снова. Как получается, что тесты верны после удаления «одного» тега.

Чтобы исправить это, я всегда должен запускать rake db:test:prepare в консоли. Я не знаю, что я делаю неправильно.

ответ

1

Когда вы запускаете Rails-тест, данные тестового прибора загружаются в тестовую базу данных. Он не очищается, если вы явно не очистите его (например, с rake db:test:prepare). Вы можете проверить это, загрузив тестовую базу данных с помощью инструмента SqliteBrowser и проверив данные.

Итак, несмотря на то, что вы изменяете тестовые приборы между прогонами, если вы не очищаете тестовую базу данных, ваши предыдущие тестовые данные все равно будут присутствовать.

+0

, но проверка рейка не включает db: test: подготовить команду? – ChrisS

+1

@Yoda, насколько мне известно. Это одна из причин, по которой я использую 'rspec'. Если вы включите 'config.use_transactional_fixtures = true' в rails_helper.rb, каждый тестовый пример запускается как отдельная транзакция в чистой базе данных. –

Смежные вопросы