使用预定义的对象值初始化多对多关系

时间:2019-01-02 22:29:42

标签: ruby-on-rails ruby-on-rails-5

我有一个类似于this previous discussion of many-to-many relationships中讨论的Categories模型的模型。简而言之,我想为所有用户加载许多库存类别(〜200个类别)。我希望使用has_and_belongs_to_many relationship,以便可以轻松找到具有各种类别的用户,并计算每个类别的用户数量。如果用户删除了对类别的使用,即使没有人使用它,我也需要其他人可以使用它。

我已经使其可以在控制台和开发模式下工作,但是它似乎无法在测试模式下工作,这使我认为必须有一种更好的方法来实现此目的。

db/seeds.rb中,我有一个数组...

c = [ "Category 1", "Category 2", "Category 3", "Category 4" ]
c.each { |cat| Category.create!(category: cat)}

我知道测试模式中存在问题,因为如果我包括...

$stdout.print Category.first.category

在测试中,我得到...

Error:
CategoryTest#test_should_be_valid:
    NoMethodError: undefined method `category' for nil:NilClass
    test/models/category_test.rb:17:in `block in <class:CategoryTest>'

或者,如果我愿意...

Category.create!(category: "Category 5")
$stdout.print Category.first.category

它输出Category 5

关于初始化Category对象的更好方法的任何想法以及如何在测试模式下看到它?

2 个答案:

答案 0 :(得分:0)

数据库种子不是为测试目的而设计的功能。

您可以使用测试夹具(导轨内置在其中)

https://guides.rubyonrails.org/testing.html

或factory_bot_rails在开始每个单元测试之前将测试数据填充到测试数据库中

https://github.com/thoughtbot/factory_bot_rails 

答案 1 :(得分:0)

如果您真的想通过种子执行此操作,请尝试db:reset(如果不确定测试数据库是否正在运行,请尝试DART_VM_OPTIONS="--old_gen_heap_size=2048 --observe"

这可以帮助您处理一些数据,但这不是设置测试数据的好方法。我建议您使用一些方法在测试中设置数据或查看Rails固定装置功能。<​​/ p>