I have a model ‘xp_jurisdiction_taxes’ which rails (3) created
correctly.
Another model ‘xp_jurisdiction_states’ has many :xp_jurisdiction_taxes.
In my spec I am using a shoulda helper to test the association but get
the
following error. BTW, greped the whole project just in case and the
string
‘taxi’ exists nowhere.
XpJurisdictionStates
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant XpJurisdictionStates::XpJurisdictionTaxis
Correction — I had originally misnamed the models by plural, however
once
fixed now, still same problem. I think this is a shoulda issue as I can
associate and access the models and associations correctly in the
console.
Correction — I had originally misnamed the models by plural, however once
fixed now, still same problem. I think this is a shoulda issue as I can
associate and access the models and associations correctly in the console.
Can you confirm the model, association and table names please?
class XpJurisdictionTax < ActiveRecord::Base
belongs_to :account_subcode
belongs_to :xp_jurisdiction_states
that should be :xp_jurisdiction_state. It belongs to one state so
singular.
public | xp_jurisdiction_taxes | table | postgres
public | xp_jurisdiction_taxes_id_seq | sequence | postgres
AccountSubcode
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant AccountSubcode::XpJurisdictionTaxis
If you run a console and type
“tax”.pluralize you will get “taxes” which is correct. However on
rails 3.0.5 if I type “taxes”.singularize I get taxis which is not
what you want. I assume it is using the same rule as would apply for
axis and axes. The solution is to specify your own rules for your
xp_jurisidiction_tax and taxes and then you should be ok.
XpJurisdictionTax
Failure/Error: it { should belong_to(:xp_jurisdiction_states) }
Again should be singular, so that explains that problem I think.
Correction — I had originally misnamed the models by plural, however
once
fixed now, still same problem. I think this is a shoulda issue as I can
associate and access the models and associations correctly in the
console.
Can you confirm the model, association and table names please?
Thanks Colin, here are the models and tables. Also to be sure went in to
db
console and verified the actual table names just in case something went
awry. Also at bottom are the three rspec/shoulda errors. I have to be
doing
something wrong but if I am I don’t see it.
class XpJurisdictionState < ActiveRecord::Base
has_many :xp_jurisdiction_taxes
end
class XpJurisdictionTax < ActiveRecord::Base
belongs_to :account_subcode
belongs_to :xp_jurisdiction_states
end
create_table “xp_jurisdiction_states”, :force => true do |t|
t.string “state_code”
t.string “state”
t.string “billing_item”
t.string “billing_memo”
t.datetime “created_at”
t.datetime “updated_at”
end
create_table “xp_jurisdiction_taxes”, :force => true do |t|
t.integer “xp_jurisdiction_state_id”
t.integer “account_subcode_id”
t.decimal “tax”
t.datetime “created_at”
t.datetime “updated_at”
end
public | xp_jurisdiction_states | table | postgres
public | xp_jurisdiction_states_id_seq | sequence | postgres
public | xp_jurisdiction_taxes | table | postgres
public | xp_jurisdiction_taxes_id_seq | sequence | postgres
AccountSubcode
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant AccountSubcode::XpJurisdictionTaxis
./spec/models/account_subcode_spec.rb:16:in `block (2 levels) in
<top
(required)>’
XpJurisdictionState
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant XpJurisdictionState::XpJurisdictionTaxis
XpJurisdictionTax
Failure/Error: it { should belong_to(:xp_jurisdiction_states) }
Expected XpJurisdictionTax to have a belongs_to association
called
xp_jurisdiction_states (XpJurisdictionTax does not have a
xp_jurisdiction_states_id foreign key.)
Rails stopped accepting inflection-related patches ages ago, but you can
add
more; google “adding activerecord inflections”. The rails docs have a
few
examples in the table_name method documentation:
… BUT some piece of code is still deciding that I have ‘taxis’ and not
‘taxes’ — spec still failing:
AccountSubcode
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant AccountSubcode::XpJurisdictionTaxis
./spec/models/account_subcode_spec.rb:16:in `block (2 levels) in <top
(required)>’
It seems as if shoulda is not picking up the inflections for some
reason. I don’t use shoulda, can you output debug during its
execution? Is so what happens if you output
“xp_jurisdiction_taxes”.singularize and “taxes”.singularize?
XpJurisdictionState
Failure/Error: it { should have_many(:xp_jurisdiction_taxes) }
NameError:
uninitialized constant XpJurisdictionState::XpJurisdictionTaxis
./spec/models/xp_jurisdiction_state_spec.rb:4:in `block (2 levels) in
<top (required)>’
So… all the important tests are failing but not my shoulda checks on my
It seems as if shoulda is not picking up the inflections for some
reason. I don’t use shoulda, can you output debug during its
execution? Is so what happens if you output
“xp_jurisdiction_taxes”.singularize and “taxes”.singularize?
=> “xp_jurisdiction_tax”
I meant to output that during the test itself if possible, to make
sure that the inflections have been picked up at that time.
So… all the important tests are failing but not my shoulda checks on
my
model relations. I can just drop these lines in my tests and be ok as
other
code is essentially checking these via its actions, but is leaving a
mystery
still open as to why. It seems to me that shoulda is doing something
funky
in determining what it expects, which on the surface seems strange (I
mean,
if I say the relation should be :xp_jurisdiction_taxes… there is
nothing
to infer… that symbol is the same in the shoulda/rspec and in the
class it
is testing…
Anyhow, if you all have any other input, appreciated. Seems to me next
step
will be to see if I can trace this through the shoulda source code,
although
not really in a place timewise right now…