3

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

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
4

1 回答 1

0

好吧,当您说要测试方法是否“有效”时,您首先需要确定“有效”的含义,无论是否提供了查询。

如果您想进行实际搜索并检查结果,那么您不需要任何测试替身,但您需要传入一个真正的查询以search供使用,并且检查结果是否准确显然会更有效你所期望的,而不是只是 not nil

如果您想检查searchscoped正确调用它们,您可以传入一个存根用于 aquery并设置对searchand的期望scoped(例如,它们被调用并带有什么参数)。您还可以为每个方法提供一个返回值并检查该方法是否返回该值。

你现在有一种混合方法,至少就第一个例子而言。你需要决定把事情往哪个方向走。

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

于 2013-10-01T20:06:46.550 回答