First Test Failures: Anything Obvious?

Still following my rails book (more like, adapting to my project as I go). My first attempt at a unit test failed. Adapting the example in the book, I came up with this:

require 'test_helper'

class RecordingTest < ActiveSupport::TestCase   test "record attributes must not be empty" do     recording = Recording.new     assert recording.invalid?     assert recording.errors[:title].any?     assert recording.errors[:speaker].any?     assert recording.errors[:date_of_event].any?     assert recording.errors[:file].any?   end end

Which gives me:

1) Failure: test_record_attributes_must_not_be_empty(RecordingTest) [/test/unit/recording_test.rb:6]: <false> is not true.

1 tests, 1 assertions, 1 failures, 0 errors rake aborted! Command failed with status (1): [/usr/bin/ruby -I"lib:test" "/usr/lib64/rub...]

The idea was to test my validation code from the model:

# cat app/models/recording.rb class Recording < ActiveRecord::Base   validate :title, :speaker, :date_of_event, :file, :presence => true   validate :title, :file, :uniqueness => true end

From the little I understand, I'm not sure why the record object is not showing up as invalid as it should, having no data added yet. The only thing I can note is that I'm using rails 2.3.5, whereas I think the book is meant for 3.

Try to save the object first and then check for validity.

Have a go in the ruby console. In there you can do recording = Recording.new and then inspect the result, call valid on it and so on to see what is not going as expected.

Colin

I don't think that is right, for a start it will not save if it is invalid.

Colin

Colin Law wrote:

Terry Michaels wrote:

# cat app/models/recording.rb class Recording < ActiveRecord::Base   validate :title, :speaker, :date_of_event, :file, :presence => true   validate :title, :file, :uniqueness => true end

Wait, double checked the book... the method is supposed to be "validates", not "validate".

Problem solved? Unfortunately, not quite. New unit test run gives me:

/usr/bin/ruby -I"lib:test" "/usr/lib64/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/unit/helpers/home_helper_test.rb" "test/unit/helpers/recordings_helper_test.rb" "test/unit/recording_test.rb" /usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1959:in `method_missing': undefined method `validates' for #<Class:0x7fefd5c73478> (NoMethodError)

Terry Michaels wrote:

Terry Michaels wrote:

# cat app/models/recording.rb class Recording < ActiveRecord::Base   validate :title, :speaker, :date_of_event, :file, :presence => true   validate :title, :file, :uniqueness => true end

Wait, double checked the book... the method is supposed to be "validates", not "validate".

Problem solved? Unfortunately, not quite. New unit test run gives me:

/usr/bin/ruby -I"lib:test" "/usr/lib64/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/unit/helpers/home_helper_test.rb" "test/unit/helpers/recordings_helper_test.rb" "test/unit/recording_test.rb" /usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb:1959:in `method_missing': undefined method `validates' for #<Class:0x7fefd5c73478> (NoMethodError)

Found a different API on the Web. Not like what is in the book, but it works. Changed the model code to the following, and then all the tests pass fine:

class Recording < ActiveRecord::Base   validates_presence_of :title   validates_presence_of :speaker   validates_presence_of :date_of_event   validates_presence_of :file   validates_presence_of :presence   validates_uniqueness_of :title   validates_uniqueness_of :file end