I am fighting with an error using rspec-on-rails-matchers.
I have a model called "Centro" based in this table
create_table "centros", :force => true do |t|
t.string "nombre"
t.string "cif"
t.string "domicilio"
t.string "codigo_postal"
t.string "poblacion"
t.string "provincia"
t.string "subdominio"
t.datetime "created_at"
t.datetime "updated_at"
endd
And I want to spec that the ''nombre'' field should be unique.
describe Centro do
before(:each) do
@centro = Centro.new
end
it do
@centro.should validate_uniqueness_of(:nombre)
end
end
and the model:
class Centro < ActiveRecord::Base
validates_uniqueness_of :nombre
end
This should pass but I have the error:
1)
''Centro should model to validate the uniqueness of nombre''
FAILED
expected "model to validate the uniqueness of nombre" but got
#<Centro
id: nil, nombre: nil, cif: nil, domicilio: nil, codigo_postal: nil,
poblacion: nil, provincia: nil, subdominio: nil, created_at: nil,
updated_at: nil>
./spec/models/centro_spec.rb:18:
I have inspect the validate_uniqueness_of method and try several things
until I think I found the culprit.
The original code, that fails
def validate_uniqueness_of(attribute)
return simple_matcher("model to validate the uniqueness of
#{attribute}") do |model|
model.class.stub!(:find).and_return(true)
!model.valid? && model.errors.invalid?(attribute)
end
end
But this works (obviously I also define a @valid_attribute hash)
def validate_uniqueness_of(attribute)
return simple_matcher("model to validate the uniqueness of
#{attribute}") do |model|
model.class.create!(@valid_attributes)
model.nombre = @valid_attributes[:nombre]
!model.valid? && model.errors.invalid?(attribute)
end
end
And the question.
What issue can be with mocking the find method in the class?
What can I try?
Thanks
Juanma.
--
Posted via http://www.ruby-forum.com/.
Well, it seems tha the error is indeed in the stubbing of the find
method in the class of the model.
def validate_uniqueness_of(attribute)
return simple_matcher("model to validate the uniqueness of
#{attribute}") do |model|
model.class.stub!(:find).and_return(true)
!model.valid? && model.errors.invalid?(attribute)
end
end
And I found that it has something to do with the names of the models or
attributes.
I have create two models ''Book'' and ''Plano''
script/generate rspec_model Book name:string
script/generate rspec_model Plano nombre:string
#in Spanish, although I have not touched the inflector)
==============================
#book.rb
class Book < ActiveRecord::Base
validates_uniqueness_of :name
end
#book_spec.rb
require File.expand_path(File.dirname(__FILE__) +
''/../spec_helper'')
describe Book do
it do
Book.new.should validate_uniqueness_of(:name)
end
end
============================
#plano.rb
class Plano < ActiveRecord::Base
validates_uniqueness_of :nombre
end
#plano_spec.rb
require File.expand_path(File.dirname(__FILE__) +
''/../spec_helper'')
describe Plano do
it do
Plano.new.should validate_uniqueness_of(:nombre)
end
end
======================================
The spec in ''Book'' pass, but the spec in
''Plano'' fails
and I even see in test.log that the there is a select query for Plano
and none for Book. The method find for class Plano is not being stubbed.
I think there is a bug!!
Juanma
--
Posted via http://www.ruby-forum.com/.
David Chelimsky
2008-Dec-29 12:20 UTC
[rspec-users] Error when mocking a method in a class
On Mon, Dec 29, 2008 at 5:04 AM, Juanma Cervera <lists at ruby-forum.com> wrote:> I am fighting with an error using rspec-on-rails-matchers. > > I have a model called "Centro" based in this table > > create_table "centros", :force => true do |t| > t.string "nombre" > t.string "cif" > t.string "domicilio" > t.string "codigo_postal" > t.string "poblacion" > t.string "provincia" > t.string "subdominio" > t.datetime "created_at" > t.datetime "updated_at" > endd > > And I want to spec that the ''nombre'' field should be unique. > > > describe Centro do > > before(:each) do > @centro = Centro.new > end > > it do > @centro.should validate_uniqueness_of(:nombre) > end > > end > > and the model: > > class Centro < ActiveRecord::Base > validates_uniqueness_of :nombre > end > > This should pass but I have the error: > 1) > ''Centro should model to validate the uniqueness of nombre'' FAILED > expected "model to validate the uniqueness of nombre" but got #<Centro > id: nil, nombre: nil, cif: nil, domicilio: nil, codigo_postal: nil, > poblacion: nil, provincia: nil, subdominio: nil, created_at: nil, > updated_at: nil> > ./spec/models/centro_spec.rb:18: > > > > I have inspect the validate_uniqueness_of method and try several things > until I think I found the culprit. > > The original code, that fails > > def validate_uniqueness_of(attribute) > return simple_matcher("model to validate the uniqueness of > #{attribute}") do |model| > > model.class.stub!(:find).and_return(true) > > !model.valid? && model.errors.invalid?(attribute) > end > endI''m not really sure why this is stubbing find, or why the stub value is true instead of a model. Actually, I don''t even see how this would specify validating uniqueness of the attribute without very specific setup: first = Centro.create(:nombre => "example") second = Centro.create(:nombre => "example") second.should validate_uniqueness_of(:nombre) I don''t see any specs for the rspec-on-rails-matchers library on github, and no activity in 9 months, so I''m guessing that it is incomplete/no longer being maintained. Josh Knowles, if you''re reading this, can you respond? Thanks, David> > > But this works (obviously I also define a @valid_attribute hash) > > def validate_uniqueness_of(attribute) > return simple_matcher("model to validate the uniqueness of > #{attribute}") do |model| > > model.class.create!(@valid_attributes) > model.nombre = @valid_attributes[:nombre] > > !model.valid? && model.errors.invalid?(attribute) > end > end > > > And the question. > What issue can be with mocking the find method in the class? > What can I try? > > Thanks > Juanma. > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >
David Chelimsky wrote:> I''m not really sure why this is stubbing find, or why the stub value > is true instead of a model. Actually, I don''t even see how this would > specify validating uniqueness of the attribute without very specific > setup: > > first = Centro.create(:nombre => "example") > second = Centro.create(:nombre => "example") > second.should validate_uniqueness_of(:nombre) >I see how it works, I think. When the matcher calls the ''valid?'' method in the object, it makes the call to the find method of the class only if we have specified the validates_uniqueness_of method in our model, if this return something then the object is not valid, this is what we are stubbing, no? But, as I said in a message before, I think the problem is with the names of the models or the attributes. I can send a tar file with a very simple app as an attachemnt if you want, that exhibits the problem. Juanma. -- Posted via http://www.ruby-forum.com/.
On Mon, Dec 29, 2008 at 7:20 AM, David Chelimsky <dchelimsky at gmail.com> wrote:> I don''t see any specs for the rspec-on-rails-matchers library on > github, and no activity in 9 months, so I''m guessing that it is > incomplete/no longer being maintained. > > Josh Knowles, if you''re reading this, can you respond?I unfortunately have let this project take a backseat to everything else that I''ve been hacking on, which is too bad as I''ve received some good patches. There are forks out on github which have specs and have fixed the problem with validate_uniqueness_of. I''ve been saying for months that I''ll pick it back up, hopefully this thread can serve as that additional motivator to get me off my ass. -- Josh Knowles phone: 509-979-1593 email: joshknowles at gmail.com web: http://joshknowles.com
Josh Knowles wrote:>There are forks out on github which have specs and have > fixed the problem with validate_uniqueness_of.I have test a plugin with that fixed (from negonicrac) and it still has the same problem for me. I see that this plugin already has specs, and want to try them. But I don''t know how to run specs in a plugin. I use rake spec:plugins but fails jmcervera at jmcervera-laptop:~/aaa/vendor$ rake spec:plugins (in /home/jmcervera/aaa) ./vendor/plugins/rspec-on-rails-matchers/spec/spec_helper.rb:2:in `require'': no such file to load -- activerecord (LoadError) from ./vendor/plugins/rspec-on-rails-matchers/spec/spec_helper.rb:2 from ./vendor/plugins/rspec-on-rails-matchers/spec/observers_spec.rb:1:in `require'' from ./vendor/plugins/rspec-on-rails-matchers/spec/observers_spec.rb:1 from /usr/lib/ruby/gems/1.8/gems/rspec-1.1.11/lib/spec/runner/example_group_runner.rb:14:in `load'' from /usr/lib/ruby/gems/1.8/gems/rspec-1.1.11/lib/spec/runner/example_group_runner.rb:14:in `load_files'' from /usr/lib/ruby/gems/1.8/gems/rspec-1.1.11/lib/spec/runner/example_group_runner.rb:13:in `each'' from /usr/lib/ruby/gems/1.8/gems/rspec-1.1.11/lib/spec/runner/example_group_runner.rb:13:in `load_files'' from /usr/lib/ruby/gems/1.8/gems/rspec-1.1.11/lib/spec/runner/options.rb:98:in `run_examples'' from /usr/lib/ruby/gems/1.8/gems/rspec-1.1.11/lib/spec/runner/command_line.rb:10:in `run'' from /usr/lib/ruby/gems/1.8/gems/rspec-1.1.11/bin/spec:4 rake aborted! Command /usr/bin/ruby1.8 -I"/usr/lib/ruby/gems/1.8/gems/rspec-1.1.11/lib" "/usr/lib/ruby/gems/1.8/gems/rspec-1.1.11/bin/spec" "vendor/plugins/rspec-on-rails-matchers/spec/observers_spec.rb" "vendor/plugins/rspec-on-rails-matchers/spec/validations_spec.rb" "vendor/plugins/rspec-on-rails-matchers/spec/associations_spec.rb" "vendor/plugins/rspec-on-rails-matchers/spec/views_spec.rb" --options "/home/jmcervera/aaa/spec/spec.opts" failed (See full trace by running task with --trace) this is the spec_helper.rb file that is failing in line 2 ===========================require ''spec'' require ''activerecord'' Dir.glob(File.dirname(__FILE__) + ''/../lib/spec/rails/matchers/*.rb'').each do |f| require f end include Spec::Rails::Matchers ================= How should I require ''activerecord''? Or how I have to do the setup for testing/specing plugins? Any URL for that? Thanks Juanma Cervera -- Posted via http://www.ruby-forum.com/.