Functional testing a has_many :through validation

The title of this post may be somewhat misleading; I am indeed UNIT
testing this, and it works fine, however I'm also functional testing a
POST to an action that is responsible for creating a new ActiveRecord
object that's associated with the "parent" via has_many :through.

class Report < ActiveRecord::Base
  # ...
  has_many :report_notifiers
  has_many :notifiers, :through => :report_notifiers
  # ...

class ReportNotifier < ActiveRecord::Base
  # ...
  belongs_to :report
  # ...

So, creating a new report with a new notifier would be simple:
@r =
@r.notifiers << Notifier.create(:label => "something", :email =>

But what happens when a user submits invalid e-mail address? Well, of
course, the validation fails. But how do I go about testing for the
presence of that validation failure message in my functional test?

Here's my existing functional test:

You should be able to do an assert_select looking for whatever the <%= errors_for :maintenance_report %> generates for the error you are expecting. Or have I missed a subtlety of your question?


Thanks for your reply Colin. In theory, there should be some way I
can test for the presence or absence of errors on something like:
@report.notifiers.errors.on (something?)

The thing is, since the post creates a new record for the associated
model, I'm not quite sure how to "access" that.

I think maybe
assert assigns(:report).notifiers.errors.on(:fieldname)
where fieldname is the field that you have added the error on.
Or something like that anyway.
If it doesn’t work you could break into the test code with the ruby debugger at that point, then you can inspect the variables and see what is where.


Colin, thanks for your help. You got me thinking in a different

I tried what you had there, but noticed that the test didn't even get
to that point. It failed IMMEDIATELY after the original post, so the
assertion never fired. Which got me thinking: why not a rescue?

  post :edit, {:m => m, :id =>, :notifiers => [1, 2, 3, '', 0,
'asdfasf', "\n\n;';'''';UPDATE notifiers SET label=\"hacked\""],
    :new_notifiers => "not a valid email!asdfasdfasf afd asdfasf 2
wgw@a asdf...\n\n\n\t\"}
rescue ActiveRecord::RecordInvalid => e
  assert_equal "Validation failed: Email is an invalid e-mail
address.", e.message

This works perfectly. Thanks for your help!