【问题标题】:rspec rails : unit test database queryrspec rails:单元测试数据库查询
【发布时间】:2018-05-08 09:15:25
【问题描述】:

我有用户模型、查询助手和控制器:助手包含一个方法,当从视图发送搜索查询请求时返回用户列表:

class UserQueryHelper

  def initialize( query = nil )
    @query = Arel.sql("UNACCENT('%#{ query }%')")
  end

  def search
    User.where( first_name.matches( @query ).or( last_name.matches( @query ) ))
  end

protected

  def users   ; User.arel_table   ; end

  def first_name
    Arel::Nodes::NamedFunction.new( "UNACCENT", [ users[ :first_name ] ] )
  end

  def last_name
    Arel::Nodes::NamedFunction.new( "UNACCENT", [ users[ :last_name ] ] )
  end

end

在我称之为助手的模型中:

def self.search( query )
    if query.present?
      UserQueryHelper.new( query ).search
    else
      all
    end
end 

在控制器中,我得到了管理员搜索的用户列表:

users_to_export = User.regular.search(params[:search]).includes( :company )

我想为此编写一些单元测试,但我没有正确的方法,我尝试了这段代码,但它不起作用:

  require 'spec_helper'

describe UserQueryHelper do

  let!( :query ) { UserQueryHelper.new( "sahnoun" ) }
  it "return user" do
    user1 = create :user, first_name: "sahnoun", last_name: "mabrouk", company: $company
    expect( query.send( :search ) ).to include user1

  end

end

【问题讨论】:

  • 你测试的是search方法还是initialize方法?你不应该对每个人进行单独的测试吗?

标签: ruby-on-rails ruby unit-testing rspec


【解决方案1】:

您一定遇到了错误stack level too deep

let!( :query ) { UserQueryHelper.new( query ) }

正在执行为

UserQueryHelper.new( UserQueryHelper.new (UserQueryHelper.new (....)))

应该定义为

let!( :query ) { UserQueryHelper.new( "<Your Test Query>" ) }

【讨论】:

  • 感谢你的评论,是的,这正是我得到的错误,所以在“”中我应该写一个查询,如:“User.where(first_name.matches(user1.first_name ).or(last_name.matches(user1.last_name)))" ?
  • @noun7 可能不是因为它应该是纯 SQL,但考虑到如果查询可以由用户构造,这可能会很危险。
  • 您可以尝试 UserQueryHelper.new( "sahnoun" ),因为您稍后会使用此名称 (sahnoun) 创建一个测试用户。您的测试将通过。
  • 我按照你说的做了,但没有通过!
  • 将输出发送给我puts query.send( :search )
猜你喜欢
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
相关资源
最近更新 更多