Can anyone point me towards a good resource on appropriately testing all the fields in a given model? Or perhaps give some advice. For example, this test below is for a model with only a single column, but when I add a new column (a date field for example), how would I extend the test to cover both the body and date column of the model? def test_that_status_note_body_is_valid note = Note.new # Empty body field assert !note.valid? assert note.errors.invalid?(:body) note.body = nil # Nil body field assert !note.valid? assert note.errors.invalid?(:body) note.body = "Testing body that should pass" # Correct body field assert note.valid? assert !note.errors.invalid?(:body) end Would I create a new test called "test_that_date_is_valid" and only test against that or would I create tests that build instances of "Note" that contain as many test cases as it would take to test against every case? (which seems correct but when I think about how many tests would be involved for a model with even 5 columns it then seems to look not so correct) I appreciate the responses, thanks! -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Matthew Williams wrote:> Can anyone point me towards a good resource on appropriately testing all > the fields in a given model? Or perhaps give some advice. > > For example, this test below is for a model with only a single column, > but when I add a new column (a date field for example), how would I > extend the test to cover both the body and date column of the model? > > def test_that_status_note_body_is_valid > note = Note.new > # Empty body field > assert !note.valid? > assert note.errors.invalid?(:body) > note.body = nil > # Nil body field > assert !note.valid? > assert note.errors.invalid?(:body) > note.body = "Testing body that should pass" > # Correct body field > assert note.valid? > assert !note.errors.invalid?(:body) > end > > Would I create a new test called "test_that_date_is_valid" and only test > against that or would I create tests that build instances of "Note" that > contain as many test cases as it would take to test against every case? > (which seems correct but when I think about how many tests would be > involved for a model with even 5 columns it then seems to look not so > correct) > > I appreciate the responses, thanks!Maybe you''re can use a generic new method - something like: def test_status_for_something note = new_note(:body => nil) ... end def new_note(options) Note.new({:body => "Default body", :header => "Default header", :date => Date.today}.merge(options)) end Btw, I suggest that you split your testcases into smaller pieces, the above could be split into test_body_should_be_invalid_when_nil, test_body_should_be_invalid_when_empty_string, test_body_should_be_valid_when_nonempty_string. Makes it easier to spot the problem when a test breaks. -- Cheers, - Jacob Atzen --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Try something like class TestModel < Test::Unit::TestCase def setup @model_instance = Model.new end ## add here whatever you can think as empty value def test_should_not_body_be_empty assert_error_on @model_instance, :body, :body => nil assert_error_on @model_instance, :body, :body => "" end # TODO: clean up this to use the first key of values hash as field def assert_error_on(model, field, values = {}) # there is no assert here cuz others field may have errors # and the idea is test one thing at time. model.valid? assert not model.errors[field].nil? end # TODO: clean up this to use the first key of values hash as field def assert_no_errors_on(model, field, values = {}) # there is no assert here cuz others field may have errors # and the idea is test one thing at time. model.valid? assert model.errors[field].nil? end end Try to keep your tests clean, do one thing at time, and reflect that thing in the test name. And add as many test you need. Always remember that Test Cases are classes so add helper method to avoid repetitive tasks is not only good, its a must. With this idea in mind test something like this: class Model < ActiveRecord::Base validates_presence_of :name validates_length_of :name, :in => 4..128 validates_uniqueness_of :name end will take at least one test per validation, but you probably wrote the tests first right? :P On Oct 1, 3:36 pm, Matthew Williams <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> Can anyone point me towards a good resource on appropriately testing all > the fields in a given model? Or perhaps give some advice. > > For example, this test below is for a model with only a single column, > but when I add a new column (a date field for example), how would I > extend the test to cover both the body and date column of the model? > > def test_that_status_note_body_is_valid > note = Note.new > # Empty body field > assert !note.valid? > assert note.errors.invalid?(:body) > note.body = nil > # Nil body field > assert !note.valid? > assert note.errors.invalid?(:body) > note.body = "Testing body that should pass" > # Correct body field > assert note.valid? > assert !note.errors.invalid?(:body) > end > > Would I create a new test called "test_that_date_is_valid" and only test > against that or would I create tests that build instances of "Note" that > contain as many test cases as it would take to test against every case? > (which seems correct but when I think about how many tests would be > involved for a model with even 5 columns it then seems to look not so > correct) > > I appreciate the responses, thanks! > -- > Posted viahttp://www.ruby-forum.com/.--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---