【问题标题】:RSpec controller GET #index test is returning an empty ActiveRecord array instead of my modelRSpec 控制器 GET #index 测试返回一个空的 ActiveRecord 数组而不是我的模型
【发布时间】:2021-12-06 04:59:29
【问题描述】:

请原谅我的生疏,很长时间以来第一次接触 Rails 和这个项目。

Ruby 版本: 2.5.0
Rails 版本: 5.1.7
RSpec 版本: 3.9.3
FactoryBot 版本: 6.2.0

这是我的 scripts_controller_spec.rb 文件,其中包含模型创建和相关测试:

require 'rails_helper'

describe ScriptsController, type: :controller do

  userID_1 = User.create!(
    email: 'ueferfrfrf@u1.com',
    password: 'useruser',
    password_confirmation: 'useruser'
  )

  script1 = Script.create!(
    name: 'YWoodcutter',
    skill: 'Woodcutting',
    bot_for: 'TRiBot',
    game_for: 'Oldschool Runescape 07',
    user_id: userID_1.id
  )
  script1.save
  
  describe "GET #index" do
    it "assigns @scripts" do
      get :index
      p script1
      expect(assigns(:scripts)).to eq([script1])
    end
  end

运行测试时,上面的打印行按预期输出:

#

但是,我得到了这个测试失败:

失败:

  1. ScriptsController GET #index 分配@scripts 失败/错误:expect(assigns(:scripts)).to eq([script1])

    预期: [#

    (使用 == 比较)

我的scripts_controller.rb 索引函数如下所示:

class ScriptsController < ApplicationController

  def index
    @scripts = Script.order(:created_at)
  end

如果您需要更多信息,请告诉我,感谢您的帮助!

【问题讨论】:

  • 在哪里创建 script1 是必不可少的。请使用相关规范代码进行更新。
  • @razvans script1 创建代码在同一个 scripts_controller_spec.rb 文件中,就在测试的上方。
  • 加上带有索引操作、任何过滤器等的控制器代码
  • 然后把整个spec文件放进去。
  • @razvans 已更新。除了一些必需的行和空测试(我省略了)之外,script_controller_spec.rb 文件中没有更多内容。如果您想查看完整的 scripts_controller 文件,那么展示它的最佳方式是什么?只需将代码放在问题中,或者 GitHub 链接会更干净吗?

标签: ruby-on-rails rspec


【解决方案1】:

根据当前代码,您似乎没有调用所有脚本。

使用

### Controller

@scripts = Script.all.order(:created_at)

### Test

## Should use factories to create the records

  let(:user) do 
    create(:user, email: 'ueferfrfrf@u1.com',
                  password: 'useruser',
                  password_confirmation: 'useruser') 
  end

  let(:script) do 
    create(:script, name: 'YWoodcutter',
                    skill: 'Woodcutting',
                    bot_for: 'TRiBot',
                    game_for: 'Oldschool Runescape 07',
                    user: user) 
  end

应该修复它。

【讨论】:

  • 试一试,但不幸的是,我仍然遇到相同的结果。对 app/controllers/scripts_controller.rb 中的 index 方法进行了更改
  • 有时在重新启动测试之前spring stop 有助于发现代码更改。
  • Script.order(:created_at)Script.all.order(:created_at) 相同。很明显,OP 在数据库中没有任何内容。
  • 如果他在 db 中没有任何东西,puts 脚本不会返回带有 id 的模型。
  • @borisrorsvort 我也是这么想的。
【解决方案2】:

我认为在调用 index 操作之前没有创建 Script 对象。因此,您得到的是空的 ActiveRecord::Relation。在这种情况下let! 应该可以解决您的问题

require 'rails_helper'

describe ScriptsController, type: :controller do

  let!(:user_1) do
    User.create!(
      email: 'ueferfrfrf@u1.com',
      password: 'useruser',
      password_confirmation: 'useruser'
    )
  end

  let!(:script1) do
    Script.create!(
      name: 'YWoodcutter',
      skill: 'Woodcutting',
      bot_for: 'TRiBot',
      game_for: 'Oldschool Runescape 07',
      user_id: user_1.id
    )
  end

  describe "GET #index" do
    before { get :index }

    it "assigns @scripts" do
      expect(assigns(:scripts)).to eq([script1])
    end
  end
end

【讨论】:

    猜你喜欢
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 2010-11-06
    相关资源
    最近更新 更多