如何编写模型规范来测试PgSearch text_search查询方法(Rspec,Rails,Postgres)

时间:2013-10-01 18:21:06

标签: ruby-on-rails postgresql rspec pg-search

我正在尝试在我的模型规范测试中编写几个测试,无论是否传入查询,以下方法的逻辑都有效。

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

1 个答案:

答案 0 :(得分:0)

嗯,当你说要测试方法是否“有效”时,首先需要确定“有效”是什么意思。

如果你想进行实际搜索并检查结果,那么你不需要任何测试双打,但你需要传递一个真正的search查询来使用,它显然会更多有效地检查结果是否符合您的预期,而不是nil

如果您想检查是否正确调用了searchscoped,可以传入query的存根,并设置search和{{ {1}}(例如,他们被称为和有什么参数)。您还可以为每个提供返回值,并检查该方法是否返回该值。

你现在有一种混合方法,至少就第一个例子而言。你需要决定采取哪些方向。

希望有所帮助。如果您在决定上述内容并查阅文档后需要帮助构建实际代码,请随时在评论中提出后续问题。