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