【问题标题】:Passing database querying tests using spec?使用规范通过数据库查询测试?
【发布时间】:2013-12-15 01:22:10
【问题描述】:

我正在学习 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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • where('title ilike :pat or synopsis ilike :pat', :pat =&gt; "%#{query}%")
    • @muistooshort 谢谢,这很有用。你知道一个简单的替代方法,所以 % 和其他 LIKE 语法将被转义吗?
    • AFAIK 你总是负责自己处理嵌入式%_。当然,我可能是错的,如果不通过 Rails 源代码进行冒险,您就无法轻松查找这些内容。
    • 感谢您的建议,我会牢记这一点。试过了,但测试仍然失败
    • @mechanicalfish 我用定义更新了问题(如果我理解正确的话)。它们直接位于我的问题的规范部分:.create(:movie, title: "Manhattan Murder Mystery")
    猜你喜欢
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2011-11-15
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多