【问题标题】:test 'where' clause using rspec使用 rspec 测试“where”子句
【发布时间】:2014-01-27 17:03:47
【问题描述】:

我一直在学习使用 rspec。 我必须测试这个:

Book.where(old:false, id:user.collections.select(:book_id).group(:book_id).map(&:book_id)).map{|b|[b.name, b.id] }

我已经做的是:

@user = Fabricate(:user)
@book1 = Fabricate(:book, old:false)
@book2 = Fabricate(:book, old:true)
@collection = Fabricate(:collection, book_id:@book1.id)
@collection2 = Fabricate(:collection, book_id:@book2.id)
@user.collections << @book1 << @book2
@books = Book.where(old:false, id:@user.collections.select(:book_id).group(:book_id).map(&:book_id)).map{|b|[b.name, b.id]}

.....

it "books" do
      subject[:filter].should == @books.map{|d| [d.name, d.id]}
end

它期待一本书,但我得到了 0。我忘记了什么吗? 提前感谢您的任何想法和帮助!

【问题讨论】:

    标签: sql ruby-on-rails rspec tdd


    【解决方案1】:

    您的代码非常不可读且难以测试。您应该将执行拆分为更小的方法。

    Book.where(old:false, id:user.collections.select(:book_id).group(:book_id).map(&:book_id)).map{|b|[b.name, b.id] }
    

    可能

    class Book
      def self.find_books_with_name(ids)
        where(old: false, id: ids).map { |b| [b.name, b.id] }
      end
    end
    

    然后你可以调用它:

    Book.find_books_and_name(user.collections.select(:book_id).group(:book_id).map(&:book_id))
    

    这对我来说同样疯狂。添加到您的用户模型和集合模型中

    class Collection
      def self.book_ids
        select(:book_id).group(:book_id).map(&:book_id)
      end
    end
    

    现在你有

    Book.find_books_and_name(user.collections.book_ids)
    

    现在您可以(并且应该)分别测试每种方法。故障会更容易发现,测试本身也会更简单,无需与各种模型和记录耦合。

    【讨论】:

    • 很抱歉,我不知道如何简单地解释代码。无论如何,非常感谢您的回答!我会尝试查看并实施您的答案
    猜你喜欢
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2013-01-10
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    相关资源
    最近更新 更多