2017-01-24 2 views
1

У меня есть модель под названием Страница, в которой много абзацев. Все это работает, но я подумал, что пришло время провести несколько тестов. По причинам мне нужно подсчитать все абзацы на странице, +1, поэтому я знаю, как пронумеровать следующий абзац. Я делаю это с использованием метода count_paragraphs в моей модели:Тестирование отношения to_to в Rails с rspec

class Page < ApplicationRecord 
    has_many :paragraphs 

    def count_paragraphs 
    paragraphs.count + 1 
    end 
end 

До сих пор так просто. Это отлично работает в моем контроллере, где я использую его для создания следующего абзаца.

@paragraph = @page.paragraphs.create(body: para_params[:body], num: @page.count_paragraphs) 

Как уже упоминалось, все это работает. Но при тестировании это не работает:

it 'has a paragraph count of 1' do 
    expect(subject.count_paragraphs).to eq 1 
end 

it 'successfully counts paragraphs' do 
    subject.paragraphs.new(body: "hello", num: 1) 
    expect(subject.count_paragraphs).to eq 2 
end 

Первый тест проходит, второй - нет. Он всегда возвращает 1. Когда я привязываю. Проверяю тест, каждый новый абзац появляется, если я делаю subject.paragraphs, но если я привяжусь к модели. paragraphs просто возвращается []. Поэтому я не понимаю, что такое модельные отношения.

Кто-нибудь знает, что я здесь делаю неправильно?

+0

Не следует ли использовать метод 'next_paragraph_number'? – Stefan

+0

это гораздо лучшее имя, да –

ответ

0

Согласно документации, count делает:

Граф все записи с помощью SQL.

Поэтому он учитывает только записи, которые были сохранены.

Вы могли бы добиться этого с помощью вызова create вместо new:

subject.paragraphs.create(body: "hello", num: 1) 

Или вы могли бы использовать size вместо count который также рассчитывает в памяти объекты:

Если коллекция не имеет был загружен, он выполняет запрос SELECT COUNT(*). Иначе он называет collection.size.

+0

Это правильно, спасибо! –

+0

Итак, когда bind.pry в модели, есть ли способ увидеть абзацы, которые находятся в памяти и не сохраняются, поскольку 'paragraph' возвращает' [] '? –

+0

Вы можете использовать 'subject.paragraphs.to_a.count' в своем тесте. – fylooi

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