单元测试Rails灯具的奇怪性

时间:2011-09-20 16:37:37

标签: unit-testing ruby-on-rails-3.1 yaml fixtures

对于模糊的问题标题感到抱歉,但是我很难将我要求的内容提炼成单行...

我有几个简单的Rails(3.1)模型通过rails g scaffold生成,我正在尝试进行单元测试。它们按以下方式定义:

class ModelA < ActiveRecord::Base
  validates_presence_of :field1, :field2
  validates_uniqueness_of :field1
end

class ModelB < ActiveRecord::Base
  validates_presence_of :field1
  validates_uniqueness_of :field1
end

每种型号都有几种固定装置,即:

model_a_no_field1:
    field2: test

model_a_no_field2:
    field1: test

model_a_ok:
    field1: test
    field2: test

model_b_no_field1:

model_b_ok:
    field1: test

我的单元测试正在测试这些验证:

class ModelATest < ActiveSupport::TestCase
  test "field1 should be present" do
    assert !model_as(:model_a_no_field1).valid?
  end

  test "field2 should be present" do
    assert !model_as(:model_a_no_field2).valid?
  end

  test "field1 should be unique" do
    model_a = model_as(:model_a_ok)
    model_a.save

    assert !model_as(:model_a_ok).valid?
  end
end

这些测试都正确通过。但是,我对ModelB的类似单元测试:

class ModelBTest < ActiveSupport::TestCase
  test "field1 should be present" do 
    assert !model_bs(:model_b_no_field1).valid?
  end

  test "field1 should be unique" do 
    model_b = model_bs(:model_b_ok)
    model_b.save

    assert !model_bs(:model_b_ok).valid?
  end
end

第二次测试失败(测试唯一性)。

我几乎可以肯定这与model_b_no_field1的空YAML灯具有关,但我不确定。我可以通过用

替换测试方法体来使测试通过
test "field1 should be unique" do
  model_b = model_bs(:model_b_ok)
  model_b.save

  model_b2 = ModelB.new

  assert !model_b2.valid?
end

哪个好,但我想了解这里发生了什么。

1 个答案:

答案 0 :(得分:3)

我认为你正在破坏rails为你创建的测试基础架构。 yaml文件中的模型应该是有效的,如果要测试无效的模型,请在测试中创建它。

在测试中创建数据具有非常明确和具体的额外价值。否则,开发人员需要打开yaml文件以了解您拥有的数据和缺少的数据。