我正在尝试在我的模型规范中编写几个测试,以测试无论是否传入查询,以下方法的逻辑都有效。
models/payment.rb
include PgSearch
pg_search_scope :search,
:against => [:id, :transaction_id],
:using => {:tsearch => {:prefix => true, :dictionary => "english"}},
:associated_against => {user: [:email, :name]}
def self.text_search(query)
if query.present?
search(query)
else
scoped
end
end
这是我正在尝试编写的测试类型的示例,但没有找到完成此测试的最佳方法。
/spec/models/payment_spec.rb
describe '#text_search' do
it "works when query is passed in" do
payments = Payment.text_search(stub(:query))
payments.should_not be_nil
# is this even a good test??
end
it "still works if nothing is passed in" do
payments = Payment.text_search(nil)
payments.should_not be_nil
# same here, does this spec test for anything helpful??
end
end
最佳答案
好吧,当您说要测试方法是否“有效”(无论是否提供查询)时,您首先需要确定“有效”是什么意思。
如果你想做一个实际的搜索并检查结果,那么你不需要任何测试替身,但你需要传入一个真正的查询以供 search
使用,它会显然,检查结果是否完全符合您的预期更有效,而不是仅仅不是 nil
。
如果你想检查 search
和 scoped
是否被正确调用,你可以传入一个 query
的 stub 并设置对 search
和 scoped
的期望(例如,它们被调用以及使用什么参数)。您还可以为每个提供一个返回值,并检查该方法是否返回该值。
您现在采用了一种混合方法,至少对于第一个示例而言是这样。您需要决定采取什么方向。
希望对您有所帮助。如果您在做出上述决定并查阅文档后需要帮助来构建实际代码,请随时在评论中提出后续问题。
关于ruby-on-rails - 如何编写模型规范来测试 PgSearch text_search 查询方法(Rspec、Rails、Postgres),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19123201/