初始化具有预定义对象值的多对多关系



我有一个模型,类似于前面讨论的多对多关系中讨论的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

输出CCD_ 4。

关于初始化Category对象的更好方法,以及如何在测试模式中看到它,有什么想法吗?

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

你可以使用测试夹具(轨道内置于一个)

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

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

https://github.com/thoughtbot/factory_bot_rails 

如果你真的想通过种子来实现这一点,请尝试RAILS_ENV=test rake db:seed(如果你不确定你的测试数据库是否处于上升状态,则尝试db:reset)。

这可以让你处理一些数据,但这不是设置测试数据的好方法。我建议您查看一些在测试中设置数据的方法,或者查看Rails fixture的功能。

最新更新