Найти последнюю созданную запись RSpec test

Как мне написать тест, чтобы найти последнюю созданную запись?

Это код, который я хочу протестировать:

Post.order(created_at: :desc).first

Я тоже использую factorybot

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
988
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы назвали свой метод 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

Вы не проверяете результат «последнего» вызова метода - просто то, что он вызывается.

Использование .last без какого-либо указанного столбца по умолчанию будет упорядочивать столбец идентификатора для модели, что означает, что это будет работать только в том случае, если используются последовательные идентификаторы (а в идеале их не должно быть). apidock.com/rails/ActiveRecord/FinderMethods/last

MattD 16.02.2021 18:32

Принятый ответ неверен. Простое выполнение 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

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

Другие вопросы по теме