Как мне написать тест, чтобы найти последнюю созданную запись?
Это код, который я хочу протестировать:
Post.order(created_at: :desc).first
Я тоже использую factorybot
Если вы назвали свой метод last_post:
def self.last_post
Post.order(created_at: :desc).first
end
Тогда в вашем тесте:
it 'should return the last post' do
expect(Post.last_post).to eq(Post.last)
end
С другой стороны, самый простой способ написать код - это просто
Post.last
И вам не следует действительно тестировать результат использования методов ruby (вы должны убедиться, что вызываются правильные методы ruby), поэтому, если вы это сделали:
def self.last_post
Post.last
end
Тогда ваш тест может быть таким:
it 'should send the last method to the post class' do
expect(Post).to receive(:last)
Post.last_post
end
Вы не проверяете результат «последнего» вызова метода - просто то, что он вызывается.
Принятый ответ неверен. Простое выполнение Post.last
упорядочит сообщения по ID
, а не по времени их создания.
https://apidock.com/rails/ActiveRecord/FinderMethods/last
Если вы используете последовательные идентификаторы (а в идеале этого не должно быть), то, очевидно, это сработает, но если нет, вам нужно указать столбец для сортировки. Так что либо:
def self.last_post
order(created_at: :desc).first
end
или:
def self.last_post
order(:created_at).last
end
Лично я бы рассматривал это как область действия, а не как специальный метод.
scope :last_created -> { order(:created_at).last }
Это позволяет вам создавать несколько хороших цепочек с другими областями действия, например, если бы у вас была одна для поиска всех сообщений определенного пользователя / учетной записи, вы могли бы затем связать это довольно чисто:
Post.for_user(user).last_created
Конечно, вы также можете связывать методы, но если вы имеете дело с методами интерфейса запросов, я считаю, что области видимости имеют больше смысла и, как правило, чище.
Если вы хотите проверить, что он возвращает правильную запись, в своем тесте вы можете сделать что-то вроде:
let!(:last_created_post) { factory_to_create_post }
. . .
it "returns the correct post"
expect(Post.last_post).to eq(last_created_post)
end
Если вы хотите получить еще лучший тест, вы можете создать пару записей перед последней записью, чтобы убедиться, что тестируемый метод извлекает правильный результат, а не только результат а из отдельной записи.
Использование
.last
без какого-либо указанного столбца по умолчанию будет упорядочивать столбец идентификатора для модели, что означает, что это будет работать только в том случае, если используются последовательные идентификаторы (а в идеале их не должно быть). apidock.com/rails/ActiveRecord/FinderMethods/last