gpt4 book ai didi

ruby-on-rails - 在 minitest 中测试 postgres "RANDOM()"

转载 作者:行者123 更新时间:2023-11-29 12:16:34 29 4
gpt4 key购买 nike

介绍

我的 RoR 项目中有父子层次结构我为我们的 ruby​​ on rails 项目编写了一个新功能,它显示了来自父项的两个随机子项记录。

class Article < ActiveRecord::Base
has_many :reviews

def to_json
{
...
reviews: reviews.n_random.as_json
...
}
end
end

class Review < ActiveRecord::Base
belongs_to :article

scope :n_random, ->(n=2) { order("RANDOM()").limit(n) }
end

现在,我遇到的问题是,即使随机性正常工作,即使在测试中,我也遇到了一些实际间接测试此功能的测试的问题。

假设我有一个 ArticlesControllerTest 测试套件,其中包含一个方法

test 'show renders correct article' do
# given
params = { format: :json, id: 1 }
article = Article.find(params[:id])

# when
post :get, params
response_article = JSON.parse(response.body, symbolize_names: true)


#then
assert_response 200
assert_equal response_article, article.to_json
end

问题

最后一个 assert_equal 失败了,因为例如:

  • response_article 包含 ids 1, 2
  • article.to_json 包含 ids 1, 3

问题

是否可以编写某种过滤器,使 postgres 的 RANDOM() 始终返回常量值?我知道我可以使用 SELECT setseed(0.5); 来设置种子,以便下一个 SELECT RANDOM(); 返回相同的值(尽管下一个 RANDOM () 会改变),但我想要实现的是在从事件记录中进行每一次可能的选择之前执行类似 setseed(0.5) 的操作。

我很乐意接受任何其他有助于我解决这个问题的回复,因为我知道 RoR 和 Postgres 是两个不同的服务器,我不知道如何从 postgres 端测试这种随机性。

inb4:我不想大幅度修改测试。

最佳答案

你可能应该使用 mocks / stubs为此,确保仅针对此测试范围的一致值。例如,使用 Mocha :

Article.any_instance.stubs(:to_json).returns({
...
reviews: reviews.last(2).as_json,
...
})

或者

Review.expects(:n_random).returns(Review.last(2))

并且,在此示例中,您可以使用以下方式撤销这些设置:

Article.any_instance.unstub(:to_json)

注意我不确定类中 :n_random stub 的语法,因为我没有测试它的环境,但希望你能理解(source here)。

这意味着,在您的测试中,您将看到一致的数据,覆盖 RANDOM() 顺序。这样您就可以测试您的 Controller 是否正在执行预期的操作,而不必担心在测试环境之外使用的随机数据。

要实现,只需在您的测试中包含以上之一,即

test 'show renders correct article' do
Review.expects(:n_random).returns(Review.last(2))

# given
params = { format: :json, id: 1 }
article = Article.find(params[:id])

# when
post :get, params
response_article = JSON.parse(response.body, symbolize_names: true)


#then
assert_response 200
assert_equal response_article, article.to_json
end

关于ruby-on-rails - 在 minitest 中测试 postgres "RANDOM()",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50992195/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com