27

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

这是其中一个测试文件:require '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

这是 factory.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 "test@example.com"
  club
end

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

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

我究竟做错了什么?

4

4 回答 4

67

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

当使用问题中的依赖属性(例如如何在工厂中email依赖)时,您需要将属性包装在花括号中,以便对其进行懒惰评估:name:club

email {"#{name}@example.com"}
于 2014-07-03T13:39:17.963 回答
6

这是一个 FactoryGirl 错误,您似乎正在使用(在 spec/features/sign_in_spec.rb:11)类似:

FactoryGirl.create :user, :name

这仅在您为 Factory 注册了一个名为 name 的特征时才有效user,更多关于特征的信息请点击此处

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

FactoryGirl.create :user, name: 'THE NAME'
于 2013-01-07T00:35:11.320 回答
3

供未来读者参考:

什么不起作用 - ArgumentError: Trait not registered: 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
于 2021-02-26T09:25:40.607 回答
1

另一个迟到的答案。因为我忘记了我的模型是非常新的并且我没有迁移test数据库,所以我撞了头。所以这个属性实际上并不存在。

即必须事先运行

rails db:migrate RAILS_ENV=test
于 2021-12-23T12:45:10.793 回答