查找上次创建的记录 RSpec 测试



如何编写测试来查找上次创建的记录?

这是我想要测试的代码:

Post.order(created_at: :desc).first

我也在使用工厂机器人

如果您将方法称为"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

如果您使用的是顺序 ID(理想情况下您不应该使用(,那么显然这将起作用,但如果不是,那么您需要指定要排序的列。因此,请执行以下任一操作:

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

如果你想有一个更好的测试,你可以在最后一条记录之前创建几条记录,以验证被测方法是否提取了正确的结果,而不仅仅是单个记录的结果。

相关内容

  • 没有找到相关文章

最新更新