ruby-on-rails - Rspec Controller 分配不按预期工作

标签 ruby-on-rails testing rspec controller

在这个项目中我使用:

gem 'rails', '~> 5.1.1' 
gem 'mongoid', '~> 6.1.0' 
gem 'rspec-rails', '~> 3.7'

我有模型书:

class Book
  include Mongoid::Document
  field :name, type: String
  field :author, type: String
  field :description, type: String
  field :status, type: String
  field :image, type: String

  has_many :histories, dependent: :destroy
  has_many :likes, dependent: :destroy
  has_many :comments, dependent: :destroy

  validates :name, :author, :description, :status, :image, presence: true

  def ordered_histories
    histories.order(taken_in: :desc)
  end

  def book_rating
    rating_array = likes.map { |like| like.rate.to_i }
    return 0 if rating_array.empty?
    (rating_array.sum / rating_array.size).round
  end
end

在 Books Controller 中,我只有 Index 和 Show 操作。 这是与 Books Controller 的索引操作相关的代码:

class BooksController < ApplicationController
  before_action :set_top_books, only: :index

  # GET /books
  # GET /books.json
  def index
    @books = Kaminari.paginate_array(Book.all).page(params[:page])
  end

  private

  def set_top_books
    @top_books = Book.all.order_by(likes_count: :desc, histories_count: :desc).limit(5)
  end
end

我有书籍工厂。这是代码:

FactoryBot.define do
  factory :book do
    name { Faker::Book.title }
    author { Faker::Book.author }
    description { Faker::Lorem.paragraph }
    image { Faker::Lorem.sentence }
    status { 'In' }
  end
end

这是我对 Controller Books action Index 的测试

require 'rails_helper'

RSpec.describe BooksController, type: :controller do
  before(:each) do
    @user = create(:user)
    sign_in @user
  end

  describe 'GET #index' do
    it 'assigns @books' do
      book = create(:book)
      get :index
      expect(assigns(:books)).to eq([book])
    end

    it 'render index template' do
      get :index
      expect(response).to render_template('index')
      expect(response).to have_http_status(200)
    end
  end
end

我在这一行有问题 expect(assigns(:books)).to eq([book])。在这个地方测试失败。我不明白为什么,因为我在开发环境中的代码按预期工作。我也在文档中通过示例进行了测试。这是测试的控制台输出:

Failures:

  1) BooksController GET #index assigns @books
     Failure/Error: expect(assigns(:books)).to eq([book])

       expected: [#<Book _id: 5af815723a4f8d22e7f3daed, name: "The Lathe of Heaven", author: "Edwin Runolfsdottir", de...t aut.", status: "In", image: "Nulla culpa sint perspiciatis nihil saepe perferendis quidem sint.">]
            got: [#<Book _id: 5af718cc3a4f8d176e551d86, name: "Precious Bane", author: "Aiden Dicki", description: "Op...luptatibus et sint soluta debitis saepe.", status: "In", image: "Aut et expedita placeat ut quos.">]

       (compared using ==)

       Diff:
       @@ -1,2 +1,6 @@
       -[#<Book _id: 5af815723a4f8d22e7f3daed, name: "The Lathe of Heaven", author: "Edwin Runolfsdottir", description: "Et dolorem tenetur et dolore. Sit et magni et ut quos quia. Ab expedita tenetur laborum cumque repellendus magnam. Perferendis saepe id cumque qui numquam. Non maxime et aut.", status: "In", image: "Nulla culpa sint perspiciatis nihil saepe perferendis quidem sint.">]
       +[#<Book _id: 5af718cc3a4f8d176e551d86, name: "Precious Bane", author: "Aiden Dicki", description: "Optio quisquam assumenda quaerat non et blanditiis ea. Fugit necessitatibus ipsum cupiditate. Suscipit explicabo vitae tempora illum omnis. Ipsum quam dolore. Rerum possimus ut vero non reprehenderit laboriosam.", status: "In", image: "Est sed autem molestiae earum.">,
       + #<Book _id: 5af718cc3a4f8d176e551d88, name: "Terrible Swift Sword", author: "Rey Beer", description: "Consequatur eligendi eaque aut quisquam voluptatum. Labore ad dolore expedita reiciendis repellat est. Error dolor et doloremque. Velit in qui fugit recusandae quia. Atque non ut accusantium consequatur similique.", status: "In", image: "Illum mollitia sed facere dolor quisquam nisi facilis.">,
       + #<Book _id: 5af718cc3a4f8d176e551d8a, name: "Bury My Heart at Wounded Knee", author: "Viva Leuschke PhD", description: "Voluptatum voluptatem laudantium possimus debitis suscipit velit. Eius assumenda dolorem. Praesentium officia provident. Officia soluta adipisci exercitationem aut at totam eveniet.", status: "In", image: "Ipsum qui nemo enim quo molestiae rerum fugit unde.">,
       + #<Book _id: 5af718cc3a4f8d176e551d8d, name: "Down to a Sunless Sea", author: "Tristian Breitenberg", description: "Ullam sunt repudiandae commodi aliquid repellendus est. Aut reprehenderit in magni saepe quis. Commodi incidunt sit. In repellat beatae aut et esse quae. Veniam nemo natus.", status: "Out", image: "Aut aut commodi quam et quis dolore non voluptates.">,
       + #<Book _id: 5af718cd3a4f8d176e551d90, name: "The Wives of Bath", author: "Devonte Mraz", description: "Similique enim neque et autem libero. Dolorem alias aut est veniam aperiam ea repellat. Consectetur iure quae nihil eos quo et. Voluptatibus et sint soluta debitis saepe.", status: "In", image: "Aut et expedita placeat ut quos.">]

我也试过将页​​面作为参数传递,如下所示:

get(:index, params: { page: 1 })

但这并没有帮助。 请帮我解决这个问题,因为我所有其他测试都正常。如果您需要更多信息,请告诉我。我可以提供 GitHub url。提前致谢。

最佳答案

这是一个与数据库不干净相关的问题。作为快速修复尝试添加:

Book.destroy_all

在创建一本书之前。正如您回答的那样,数据库清理器的配置是一个可靠的解决方案:

config.before(:suite) do 
  DatabaseCleaner[:mongoid].strategy = :truncation 
  DatabaseCleaner.clean_with(:truncation) 
end 

config.around(:each) do |example| 
  DatabaseCleaner.cleaning do 
    example.run 
  end
end

关于ruby-on-rails - Rspec Controller 分配不按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50315260/

相关文章:

ruby - Rspec 无方法错误

ruby-on-rails - rspec Rails 模拟 session 哈希

ruby-on-rails - named_scope 中的变量字段名称?

ruby-on-rails - 要求用户选择一个值

javascript - Rails 在同一页面提交后显示信息

ruby-on-rails - 如何使用不命中数据库的 Factory Girl 测试 Rails 中的关系?

.Net PetaPoco 默认查询参数

sql-server - tSQLt 测试中的模拟和安全权限如何工作?

javascript - webrtc 应用程序的自动化测试?

ruby-on-rails - 如何在RSpec中验证渲染模板的局部性