我只是在这个问题上寻找高级/经验丰富的Ruby / Rails开发人员的答案,因为我认为这是一个更高级的问题。
我有一个我正在研究的宝石,它为AR模型添加了一些行为。我必须为很多不同的关联(has_many,habtm,has_one等)测试它,并且我还必须在为关联传递不同选项时测试行为(例如:foreign_key)。现在有了所有这些不同的模型,我可以在数据库中使用相同的表,因为字段本身不需要更改,只有通过has_many,belongs_to等指定的行为。 请记住,有很多不同的选项,因此模型的数量非常大。
首先,我不认为在测试本身旁边有/或者在测试本身中定义模型是不好的做法(如果我有多个测试使用相同的模型,那么我会将它们组合在一起,使用before方法)。所以这是我的目标之一,如果您不同意,可以对此发表评论。
我不确定的第二件事是我想在所有测试中保持模型的简单/相同名称,例如“Task”,而不是TaskWithManySubtasksAndForeignKey或类似丑陋的东西。问题是有这么多模型很难找到有意义和简单的名字。我对此并不十分肯定 - 使用相同的名称,因为它是一个常数,有点问题。我有一个代理类的解决方案,但我认为这不是最佳解决方案。我正在考虑使用变量(使用let方法),如“taskModel”,但它看起来有点冗长和不寻常。
另一个想到的选项,但我不确定是否可以轻松完成,是删除现有关联,然后定义一个新关联。所以例如添加一个has_many然后删除它,添加一个habtm ...
你会怎么做呢?
答案 0 :(得分:1)
在spec文件中定义唯一模型不一定是个坏主意,因为它可以很容易地确定每个模型的确切定义。这种方法的明显问题是如果要在其他测试文件中重用模型。 Rails的方法是定义all the models in separate files,然后在需要它的测试中只需要它们。
我认为这实际上取决于您拥有多少型号以及您想要重复使用多少型号。在我的一个宝石中,我采用了defining the models in the spec file的方法,在另一个宝石中,我在spec helper中定义了它们,而在另一个宝石中,我采用了Rails方法并使用了separate directory他们。如果你问我喜欢哪一个,我可能会选择也包含模型的规格,因为它都在一个地方。绝对是一个主观问题。
我偶尔采用的另一种方法是创建一个匿名类,保证只能在该测试的生命周期内使用:
describe 'my test' do
let(:my_class) do
Class.new(Task) do
has_many :things
belongs_to :something_else
end
end
it 'should have many things' do
my_class.should have(100).things
end
end