Shoulda: Test validates_presence_of :on => :update
Asked Answered
E

4

6

I'm using Shoulda in combination with Test::Unit on one of the projects I work on. The issue I'm running into is that I recently changed this:

class MyModel < ActiveRecord::Base
  validates_presence_of :attribute_one, :attribute_two
end

to this:

class MyModel < ActiveRecord::Base
  validates_presence_of :attribute_one
  validates_presence_of :attribute_two, :on => :update
end

Previously, my (passing) tests looked like this:

class MyModelTest < ActiveSupport::TestCase
  should_validate_presence_of :attribute_one, :attribute_two
end

As far as I can tell, there is no parameter to should_validate_presence_of that will cause this test to continue to pass with the changes specified above. Short of abandoning Shoulda when testing the requirement of :attribute_two, is there any way around this?

Endpaper answered 5/1, 2010 at 21:19 Comment(0)
C
2

In that past I have just used a small custom should block to get around this problem:

should "require :attr_two on update" do
  mm = Factory(:my_model)
  mm.attr_two = nil
  mm.save
  assert_equal false, mm.valid?
  assert_equal("can't be blank", mm.errors.on(:attr_two))
 end

Hopefully shoulda will keep improving by allowing further AR validation options in the future. Let me know what you think, cheers.

Cellophane answered 6/1, 2010 at 10:38 Comment(0)
M
8

What about something like this? (for shoulda-matchers-3.1.1)

subject { FactoryGirl.build(:your_model) }
it { is_expected.to validate_presence_of(:attribute_one) }
it { is_expected.to validate_presence_of(:attribute_two).on(:update) }
Martinelli answered 13/7, 2016 at 11:52 Comment(0)
C
2

In that past I have just used a small custom should block to get around this problem:

should "require :attr_two on update" do
  mm = Factory(:my_model)
  mm.attr_two = nil
  mm.save
  assert_equal false, mm.valid?
  assert_equal("can't be blank", mm.errors.on(:attr_two))
 end

Hopefully shoulda will keep improving by allowing further AR validation options in the future. Let me know what you think, cheers.

Cellophane answered 6/1, 2010 at 10:38 Comment(0)
O
2

I have tried a solution similar to what tsdbrown suggested. This type of test passes when I have:

validates_presence_of :attr_two

But the test fails if I change the model to:

validates_presence_of :attr_two, :on => :save

It fails because the :attr_two error is [] instead of ["can't be blank"]

Olivine answered 28/1, 2011 at 0:12 Comment(0)
M
2

In Rspec you can do the following:

describe MyModelTest do
  describe "validations" do
    should_validate_presence_of :attribute_one

    context "on update" do
      subject { FactoryGirl.create(:my_model_test) }

      should_validate_presence_of :attribute_two
    end
  end
end
Matson answered 21/2, 2013 at 14:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.