【问题标题】:Rails unit test - undefined method 'users'Rails 单元测试 - 未定义的方法“用户”
【发布时间】:2016-09-21 11:48:46
【问题描述】:

我一直在尝试弄清楚如何进行测试,但似乎没有任何东西可以解决我的问题。每次我尝试运行任何测试时,都会收到此错误:

NoMethodError: undefined method `users' for #<#<Class:0x00560775e00768>:0x00560775e00470>

我如何在模型中运行测试:ruby test/models/plan_test.rb

我正在尝试运行最基本的测试(Rails 给我的一个例子),所以它没有链接到任何模型/夹具。 我的模型:

require File.expand_path("../../test_helper", __FILE__)

class PlanTest < ActiveSupport::TestCase
  test "the truth" do
    assert true
  end
end

我也创建了一个空的测试数据库,当我尝试在数据库中添加夹具时,我得到了同样的错误。

感谢您的关注:)

编辑: 跟踪夹具命令(rake db:fixtures:load RAILS_ENV=test --trace):

[DEPRECATION] `last_comment` is deprecated.  Please use `last_description` instead.
** Invoke db:fixtures:load (first_time)
** Invoke environment (first_time)
** Execute environment
** Invoke db:load_config (first_time)
** Execute db:load_config
** Execute db:fixtures:load
rake aborted!
NoMethodError: undefined method `users' for #<#<Class:0x005555661d3920>:0x005555661d3830>
(erb):4:in `get_binding'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/2.2.0/erb.rb:863:in `eval'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/2.2.0/erb.rb:863:in `result'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixture_set/file.rb:42:in `render'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixture_set/file.rb:33:in `rows'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixture_set/file.rb:24:in `each'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixtures.rb:760:in `block (2 levels) in read_fixture_files'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixture_set/file.rb:15:in `open'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixtures.rb:759:in `block in read_fixture_files'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixtures.rb:758:in `each'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixtures.rb:758:in `each_with_object'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixtures.rb:758:in `read_fixture_files'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixtures.rb:590:in `initialize'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixtures.rb:514:in `new'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixtures.rb:514:in `block (2 levels) in create_fixtures'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixtures.rb:511:in `map'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixtures.rb:511:in `block in create_fixtures'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/connection_adapters/abstract_mysql_adapter.rb:288:in `disable_referential_integrity'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/fixtures.rb:508:in `create_fixtures'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/activerecord-4.2.5/lib/active_record/railties/databases.rake:206:in `block (3 levels) in <top (required)>'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/task.rb:248:in `call'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/task.rb:248:in `block in execute'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/task.rb:243:in `each'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/task.rb:243:in `execute'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/task.rb:187:in `block in invoke_with_call_chain'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/task.rb:180:in `invoke_with_call_chain'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/task.rb:173:in `invoke'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/application.rb:152:in `invoke_task'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/application.rb:108:in `block (2 levels) in top_level'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/application.rb:108:in `each'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/application.rb:108:in `block in top_level'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/application.rb:117:in `run_with_threads'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/application.rb:102:in `top_level'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/application.rb:80:in `block in run'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/application.rb:178:in `standard_exception_handling'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/lib/rake/application.rb:77:in `run'
/home/ioana/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/rake-11.2.2/exe/rake:27:in `<top (required)>'
/home/ioana/.rbenv/versions/2.2.3/bin/rake:23:in `load'
/home/ioana/.rbenv/versions/2.2.3/bin/rake:23:in `<main>'
Tasks: TOP => db:fixtures:load

我的用户夹具的一部分(它们都具有相同的结构):

one:
  email: ioana1@ioana.com
  name: Ioana1
  password: MyString
  verified: 1
  token: MyString
  remember_token: MyString
  plan_id: <%= plan(:p0).id %>
  subscription_id: 1
  subscription_next_bill_date:
  email_hash: 1
  referred_by_user_id: <%= users(:two).id %>
  subscription_status: deleted

three:
  email: ioana3@ioana.com
  name: Ioana3
  password: MyString
  verified: 1
  token: MyString
  remember_token: MyString
  plan_id: <%= plan(:p1).id %>
  subscription_id: 1
  subscription_next_bill_date: 2016-08-04
  subscription_update_url: MyString
  subscription_cancel_url: MyString
  email_hash: 1
  subscription_registration_date: 2016-07-04
  subscription_status: active

【问题讨论】:

  • 能否请您发布完整的堆栈跟踪(不仅仅是错误消息)?因为通常堆栈跟踪会告诉您发生错误的确切文件和行以及调用该方法所涉及的所有方法。
  • 我更新了问题。我无法跟踪单元测试,但我发布了夹具错误..
  • 似乎问题出在您的设备文件中。你能发布你的固定装置吗?或者在这些文件中搜索users 并发布该部分?
  • 我添加了夹具的一部分。会不会是erb里面的plan引用的原因?
  • 夹具文件是否命名为test/fixtures/users.yml

标签: ruby-on-rails ruby unit-testing ruby-on-rails-4 testunit


【解决方案1】:

试试这个:

一个:
      电子邮件:ioana1@ioana.com
      名称:Ioana1
      密码:MyString
      已验证:1
      令牌:MyString
      remember_token:我的字符串
      计划:p0
      订阅 ID:1
      订阅下一个账单日期:
      电子邮件哈希:1
      refered_by_user:两个(或您命名自引用的方式)
      订阅状态:已删除

http://api.rubyonrails.org/v2.3/classes/Fixtures.html

【讨论】:

    【解决方案2】:

    检查您是否有一个名为 app/models/user.rb 的有效模型文件,以及您是否使用 rails g model user 生成了用户模型,或者您是否为用户表创建了迁移,是否运行迁移。

    RAILS_ENV=test rake db:migrate
    

    您的app/models/user.rb 至少应包含:

     class User < ActiveRecord::Base
     end
    

    更新:您在下面的评论说您已删除迁移文件。您始终可以通过以下方式让您的测试数据库镜像开发数据库 rake db:test:prepare

    【讨论】:

    • 我的用户模型迁移已被删除,因为我正在处理旧数据库。这可能是问题吗? (所以我的架构不反映我的数据库)
    • 是的。由于错误undefined method 'users' 它表明该类未在任何地方定义。
    • 试试rake db:test:prepare
    • 我有类用户,模型在app/models/user.rb中,在生产或开发中一切正常..这个问题只在测试数据库上。
    • 如果您根据您的评论而不是您的问题将&lt;%= users(:one).id %&gt; 更改为&lt;%= user(:one).id %&gt;,会发生什么情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 2013-07-31
    • 2014-03-18
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多