Ruby on rails 有产品型号的工厂女孩:Rspec告诉我;“未注册的特征”;

Ruby on rails 有产品型号的工厂女孩:Rspec告诉我;“未注册的特征”;,ruby-on-rails,rspec,factory-bot,Ruby On Rails,Rspec,Factory Bot,嗨,魔幻社区 对于那些有时间的人来说,仍然是一个有基本问题的新手;-) 我创建了这样的用户模型和产品模型(感谢@grotori): 类用户 拥有多个:自有产品,类别名称:“产品”,外键:“所有者id” 有很多:借用的产品,类别名称:“产品”,外键:“借用者id” 结束 类产品 属于:所有者,类别名称:“用户”,外键:“所有者id” 属于:借款人,类别名称:“用户”,外键:“借款人id” 结束 然后我使用FactoryGirl创建了一个factories.rb,如下所示: FactoryGirl

嗨,魔幻社区

对于那些有时间的人来说,仍然是一个有基本问题的新手;-)

我创建了这样的用户模型和产品模型(感谢@grotori):

类用户
拥有多个:自有产品,类别名称:“产品”,外键:“所有者id”
有很多:借用的产品,类别名称:“产品”,外键:“借用者id”
结束
类产品
属于:所有者,类别名称:“用户”,外键:“所有者id”
属于:借款人,类别名称:“用户”,外键:“借款人id”
结束
然后我使用FactoryGirl创建了一个factories.rb,如下所示:

FactoryGirl.define do
工厂:用户做什么
序列(:name){n}“Person}{n}”
顺序(:email){| n |“Person{n}@example.com”}
密码“kaboum”
密码确认“卡布姆”
结束
工厂:产品做什么
名称“产品”
主人
借贷者
结束
结束
要测试
dependent::destroy
条件,如下所示:

描述用户所做的事情
在做之前
@user=user.new(名称:“示例用户”,
电子邮件:“user@example.com",
密码:“卡布姆”,
密码确认:“卡布姆”)
结束
描述“产品协会”是什么
在{@user.save}之前
让我来!(:product){FactoryGirl.create(:product,所有者:@user)}
它“应该销毁相关产品”吗
产品被销毁=@user.owned\u products.first
@用户破坏
期望(产品被销毁)。而不是空的
期望(Product.where(id:Product\u to\u destroming.id))为空
结束
结束
结束
Rspec给我答案
ArgumentError:Trait not registed:owner

我搜索了stackoverflow,但无法解决我的问题。一种解决方案是为我的factories.rb中的“owner”或“borrower”字段指定一个默认值,但我不希望这样,这是可能的


我们将非常感激您的帮助:-)

恐怕您的联系关系不对。在纠正模型之前,无需浪费时间调试FactoryGirl

从常识上讲,一个产品可以被许多用户借用或购买。用户可以借用或购买许多产品。为什么这段关系有很多而且属于你

也许这样做会更好

class User < ActiveRecord::Base
  has_many :orders
  has_many :borrrow_records
end

class Order < ActiveRecord::Base
  belongs_to :user
  belongs_to :product
end

class BorrowRecord < ActiveRecord::Base
  belongs_to :user
  belongs_to :product
end      

class Product < ActiveRecord::Base
  has_many: orders
  has_many: borrow_records
end
class用户
正如@kiddorails所说,我只需要为我的所有者和借款人添加特定的工厂。现在它来了(在user_spec.rb部分略有不同):

spec/factories.rb

factory:owner,:class=>“User”do
序列(:name){n|“所有者{n}}
顺序(:email){| n |“owner{u35;{n}@example.com”}
密码“kaboum”
密码确认“卡布姆”
结束
工厂:借方,:类=>“用户”do
序列(:name){| n |“借款人{n}}”
顺序(:email){n|“借款人{n}@example.com”}
密码“kaboum”
密码确认“卡布姆”
结束
工厂:产品做什么
序列(:name){n}“乘积{n}}”
主人
借贷者
结束
规格/型号/用户规格rb

如何描述“产品关联”
在{@user.save}之前
让我来!(:product){@user.owned_products.create(名称:“tabouret”)}
它“应该销毁相关产品”吗
product_id=@user.owned_products.first.id
@用户破坏
期望(产品id)。不是零
预期(Product.where(id:Product_id))为空
结束
结束

我相信这可以在不增加业主和借款人工厂的情况下解决:

  factory :product do
    name "Product"
    association :owner, factory: :user
    association :borrower, factory: user
  end

您是否使用class
User
定义了工厂
owner
borrower
?我刚刚添加了用户工厂…我认为您将它们定义为
factory:owner,:class=>“User”do.
。另外,请仔细阅读下面Billy Chan指出的答案。我不明白为什么我的交往关系是错误的。用户可以是借款人和所有者,用户可以拥有任意数量的产品。另一方面,一个产品只能有一个所有者和一个借贷者…@FloRahl,如果产品的每一部分都是唯一的,您的模型应该可以修改一下。如果它们是普通产品,我认为它们不适用。每个产品都是独一无二的,因为它们是由用户添加和命名的。稍后我将添加类别来对它们进行排序。你能帮我更正一下吗?@FloRahl,我明白了,一个类似的例子是二手游戏市场。但是,您是否仍然需要订单和借阅记录模型来存储借阅或购买交易?如果借阅,产品可以退回,并且可以再次借阅。所以一个产品可能有几个借阅记录,每个记录有不同的用户和借阅者。想想看。