使用Rspec测试类似字段的ActiveRecord验证

时间:2013-04-21 08:03:41

标签: ruby-on-rails bdd rails-activerecord rspec-rails

我最近开始学习RoR和TDD,并且无法找到处理这种情况的最佳方法。

我有一个ActiveRecord模型,它有两个共享相同验证的字段。

如何编写RSpec测试,该测试对相似的字段使用相同的测试?

“共享示例”在这种情况下看起来像是一个很有前途的功能,但似乎不起作用,因为我需要测试整个模型,但我只是将单个字段传递给共享示例。

以下是我失败的尝试:

describe Trip do
  before do
    @trip = trip.new(date: '2013-07-01', city_1: "PORTLAND", 
            city_2: "BOSTON")
  end

  subject { @trip }

  shared_examples "a city" do
    describe "when not uppercase" do
      before { city = city.downcase }
      it { should_not be_valid }
    end
  end

  describe "city_1 must be valid" do
    it_should_behave_like "a city" do
      let!(:city) { @trip.city_1}
    end
  end

  describe "city_2 must be valid" do
    it_behaves_like "a city" do
      let!(:city) { @trip.city_2}
    end
  end
end

此操作失败,因为更新城市变量不会更新行程模型。有没有办法动态地将它与模型联系起来?

顺便说一句,如果我粘贴在每个字段下,所有测试都可以自行运行。它只是在shared_example的上下文中不起作用。

非常感谢任何指导。

1 个答案:

答案 0 :(得分:0)

你可以在循环中执行断言,并使用一点元编程,但我会反对它。测试应该尽可能简单明了,即使这意味着重复一点。如果只涉及两个字段,请重复它。