使用规范传递数据库查询测试?

时间:2013-12-15 01:22:10

标签: ruby-on-rails ruby database rspec class-method

我正在学习rspec和数据库,并拥有一个具有以下架构的电影数据库。我想知道如何通过这项测试,因为我的努力似乎是徒劳的。如果您需要任何其他信息,请告诉我,以防我离开一些有用的东西:

模式

 create_table "movies", force: true do |t|
   t.string   "title",      null: false
   t.integer  "year",       null: false
   t.text     "synopsis"
   t.integer  "rating"
   t.datetime "created_at"
   t.datetime "updated_at"
   t.integer  "genre_id",   null: false
   t.in
end

create_table "genres", force: true do |t|
    t.string   "name",       null: false
    t.datetime "created_at"
    t.datetime "updated_at"
  end

模型设置:

class Movie < ActiveRecord::Base
  validates_presence_of :title
  validates_presence_of :year
  validates_presence_of :genre

  has_many :cast_members
  has_many :actors, through: :cast_members

  belongs_to :genre
  belongs_to :studio

Rspec测试:

it "partially matches movie titles" do
  results = Movie.search('Manhat')

  expect(results.count).to eq(2)
  expect(results.include?(manhattan)).to be_true
  expect(results.include?(mystery)).to be_true
end

Rspec测试参数输入:

.create(:movie, title: "Manhattan Murder Mystery"

代码我到目前为止尝试了几种变体:

class Movie < ActiveRecord::Base

等,上面......

def self.search(query)  
  select('title').where('title ilike ? OR synopsis ilike ?','%query%', '%query%')
end

1 个答案:

答案 0 :(得分:1)

您没有将参数传递给查询。您始终在搜索包含“查询”的结果。你应该做的是:

select('title').where('title ilike ? OR synopsis ilike ?',"%#{query}%", "%#{query}%")

这会将"#{query}"替换为传递给搜索方法的参数。