RSpec 给出错误“特征未注册:名称”

问题描述 投票:0回答:6

我尝试使用 RSpec 在 Windows 上测试我的 Rails 3 应用程序。我已经编写了测试和工厂,但无法解决在命令行上运行 RSpec 时出现的问题。

这是测试文件之一: 需要“spec_helper”

describe "SignIns" do
  it "can sign in" do
    user = FactoryGirl.create(:user)
    visit new_user_session_path
    fill_in "login", with: user.username
    fill_in "password", with: user.password
    click_on "sign in"
    current_user.username.should == user.username
  end
end

这是工厂。rb:

factory :layout do
  name "layout1"
end

factory :club do
  sequence(:name) { |i| "Club #{i}" }
  contact_name "John Doe"
  phone "+358401231234"
  email "#{name}@example.com"
  association :layout
end

factory :user do
  sequence(:username) { |i| "user#{i}" }
  password 'password'
  email "[email protected]"
  club
end

当我尝试运行 RSpec 时,出现以下错误:

trait not registered: name
  #C: in 'object'
  #.spec/features/sign_in_spec.rb:11:in 'block (2 levels) in (top(required))

我做错了什么?

ruby-on-rails-3 rspec factory-bot
6个回答
67
投票

我知道这是一个老问题,但万一其他人在搜索“特征未注册”时最终来到这里:

当使用依赖属性时,例如

email
如何依赖于问题中
name
工厂中的
:club
,您需要将属性括在大括号中,以便它得到延迟评估:

email {"#{name}@example.com"}

7
投票

这是一个FactoryGirl错误,看来你正在使用(在spec/features/sign_in_spec.rb:11)类似的东西:

FactoryGirl.create :user, :name

只有当您注册了一个名为“工厂名称”的特征时,这才有效

user
,更多关于特征的信息这里

请注意,如果您只想覆盖已创建用户的名称,则语法为

FactoryGirl.create :user, name: 'THE NAME'

4
投票

供未来读者参考:

什么不起作用 - 参数错误: 特征未注册:user_id

    FactoryBot.define do
      factory :startup do
        user_id
        name { FFaker::Lorem.word }
        website { FFaker::Internet.uri(host: 'example.com') }
        founded_at { "01.01.2000" }
      end
    end

当一切看起来都正确时,我如何使用其中任何一个解决这个问题:

  1. 在 user_id 之后放置空大括号
    FactoryBot.define do
      factory :startup do
        user_id {}
        name { FFaker::Lorem.word }
        website { FFaker::Internet.uri(host: 'example.com') }
        founded_at { "01.01.2000" }
      end
    end
  1. 将 user_id 移至其他使用块的助手下方:
    FactoryBot.define do
      factory :startup do
        name { FFaker::Lorem.word }
        website { FFaker::Internet.uri(host: 'example.com') }
        founded_at { "01.01.2000" }

        user_id
      end
    end

1
投票

又一个迟来的答案。我敲了敲头,因为我忘记了我的模型是非常新的,而且我没有迁移

test
数据库。所以这个属性实际上并不存在。

即必须提前跑

rails db:migrate RAILS_ENV=test

0
投票

就我而言,以上(以下?)答案都无法帮助解决

trait not registered
错误。

这次是因为装货工厂顺序不当造成的。我移动了一个带有声明的全局特征的文件,FactoryBot 开始以不正确的顺序加载它。

我是如何解决这个问题的? 将其重命名为“spec/factories/01_factory_traits”,问题就解决了。

也许有更好的方法,但它确实有效。


0
投票

我遇到了类似的问题,这是由于我们为尚未加载的函数分配了属性。我们收到了特征未注册错误,结果发现这是由于当属性定义不明确时,factorybot 的搜索顺序造成的。

https://www.rubydoc.info/gems/factory_bot/5.1.1/FactoryBot/DefinitionProxy:method_missing

© www.soinside.com 2019 - 2024. All rights reserved.