NoMethodError: undefined method `mock' with Mocha and Rails 3 - ruby-on-rails

I'm trying to use mocha in my Rails 3 project but keep getting the following exception:
NoMethodError: undefined method `mock' for #<MochaTest:0x00000101f434e8>
/Users/John/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.0.10/lib/action_dispatch/testing/assertions/routing.rb:175:in `method_missing'
test/functional/mocha_test.rb:7:in `block in <class:MochaTest>'
Test
I've written the simplest test possible:
require 'test_helper'
class MochaTest < ActionController::TestCase
test "test mocha" do
order = mock('order')
end
end
I run it using ruby -Itest test/functional/mocha_test.rb
I've tried rake test and it gives exactly the same exception.
test_helper.rb
ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
class ActiveSupport::TestCase
#....
require 'test/unit'
require 'mocha'
end
GemFile
source 'http://rubygems.org'
gem 'rails', '3.0.10'
gem 'sqlite3'
gem 'devise', '1.4.5'
gem 'activemerchant'
gem 'geo_location'
gem 'nokogiri'
gem "nifty-generators", :group => :development
gem 'mocha', '0.10.0'
Things I've Tried
Installing mocha 0.9.5 after reading 0.9.5-7 had issues with this. I get an undefined method name exception instead
Changing where I require mocha - at the bottom of test_helper.rb, top of test etc.
Tried calling mock() in rails console test - I get the same exception
I'm tearing my hair out with this. Any ideas would be gratefully received.

I found the answer immediately after I'd posted this.
Here's the answer: Mocha Mock Carries To Another Test
In short, I changed
gem 'mocha', '0.10.0'
to
gem 'mocha', '0.10.0', :require => false
and it worked like a charm!

Related

Wrong version of dependence gem when run test for my gem

I have been developing gem.
For test my gem I use ActiveRecord.
When I run test I get some error because my gem doesn't support version 5.0 of ActiveRecord.
But in my gemspec I have:
spec.add_development_dependency 'activerecord', '~> 4.2'
Also I tried to user Gemfile.local but it didn't get positive result.
What a right way for set particular version for a gem?
I figure out problem was in my test_helper file:
begin
require File.dirname(__FILE__) + '/../../../../config/environment'
rescue LoadError
require 'rubygems'
gem 'activerecord'
gem 'actionpack'
require 'active_record'
end
When I setted explicit version for gem everything has worked fine:
gem 'activerecord', "4.2.7.1"
gem 'actionpack', "4.2.7.1"

Rspec SimpleCov NoMethodError

When running my rails 4 rspec suite via rake everything works correctly but when attempting to run rake simplecov I get hundreds of failures all w/ a NoMethodError something like:
1) Answer Validations
Failure/Error: it { should validate_presence_of :text }
NoMethodError:
undefined method `validate_presence_of' for #<RSpec::Core::ExampleGroup::Nested_16::Nested_1:0x007faf9fb5b7c8>
# ./spec/models/answer_spec.rb:12:in `block (3 levels) in <top (required)>'
Any clues as to why this is happening? I should also mention that I'm testing using sqlite3 :memory:.
The shoulda libraries aren't being included in your simplecov run.
Is simplecov run in a different environment than :test perhaps? That may make the shoulda gem not be loaded if it's only in the :test group in your Gemfile.
How are you including simplecov in your spec_helper? Something like this?
require 'simplecov'
require 'simplecov-rcov'
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
SimpleCov.start 'rails' if ENV['COVERAGE']
As the very first lines of your spec_helper.rb?
Something like this in your Gemfile?
group :test, :development do
...
gem 'rspec-rails', '~> 2.0'
gem 'shoulda-matchers'
end
group :test do
gem 'simplecov'
gem 'simplecov-rcov'
end
And executing it like so?
$ COVERAGE=true bundle exec rake spec
This recipe is working very well for me in many projects. The RCov formatter may not be important depending on your purposes.

Using Rspec and Shoulda, why is 'setup' undefined?

UPDATE 2: require {path_to_spec_helper} solves the setup undefined issue, but now all of the static variables are suddenly undefined, and All FactoryGirl-made objects don't pass validation (even though inspecting shows that the object should pass validation). And Changing FactoryGirl to save_with_validation(false) just makes the object nil in my tests, breaking everything.
UPDATE:
I threw this into my code:
context "some context" do
ap self.respond_to?(:setup)
setup do
raise "stop"
And the respond_to line printed true, but then proceeded to throw the method_missing error below. So, I guess it's just undefined within context? It didn't used to be that way.
Original Post:
For some reason, unknown to me, it seems that context / should / setup are undefined in my tests. I'd change all the setup's to before(:each)'s and then there would be a problem with should or context. When I change all of the rspec / shoulda matchers to the old-skool style of describe - before(:each) - it{}, my tests will run, but won't actually get executed. (the progress in the console shows no tests being run (no dots)).
So, I guess, how do I verify my test environment is set up properly?
Here is my configuration
gem file:
# can't be in test group because it's required in the rake file
gem "single_test"# because running all the tests all the time takes too long
group :test do
# helper gems
gem "rspec-rails", "1.3.4"
gem "rspec", "1.3.2"
gem "shoulda"
gem "database_cleaner"
gem "crack" #for XML / JSON conversion
gem "mocha" #required for .requires and .stubs
gem "factory_girl", :require => false
# view and functional
gem "capybara", "1.1.1"
gem "cucumber", "1.1.0"
gem "cucumber-rails", "0.3.2"
gem "culerity"
gem "launchy"
gem "hpricot"
gem "gherkin"
gem "rack"
gem "webrat"
# tools
gem "json"
gem "curb"
end
Required things in test hepler:
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
require "bundler/setup"
Bundler.require(:test)
require 'test_help'
require 'spec'
require 'spec/expectations'
require 'factory_girl'
binary info:
ruby 1.8.7
rvm 1.7.2
gem 1.8.21
bundle 1.1.4
rake 0.9.2.2
rails 2.3.14
And my error:
`method_missing': undefined method `setup' for Spec::Example::ExampleGroup::Subclass_1:Class (NoMethodError)
stack trace:
from test/unit/my_test.rb:257
from /Users/me/.rvm/gems/ruby-1.8.7-p352/gems/rspec-1.3.2/lib/spec/example/example_group_methods.rb:188:in `module_eval'
from /Users/me/.rvm/gems/ruby-1.8.7-p352/gems/rspec-1.3.2/lib/spec/example/example_group_methods.rb:188:in `subclass'
from /Users/me/.rvm/gems/ruby-1.8.7-p352/gems/rspec-1.3.2/lib/spec/example/example_group_methods.rb:55:in `describe'
from /Users/me/.rvm/gems/ruby-1.8.7-p352/gems/rspec-1.3.2/lib/spec/example/example_group_factory.rb:31:in `create_example_group'
code around line 257 of the last code bit on the stack:
context "some context" do
setup do
...
If you didn't, first you have to generate your spec/spec_helper.rb and spec/rails_helper.rb files. you can do this with the following command:
rails generate rspec:install.
Once the files are created, make sure rails_helper.rb requires spec_helper.rb, otherwise it will not work and require "rails_helper" on top of your spec files.
You can check more detailed configuration of rails_helper.rb and spec_helper.rb here: https://kolosek.com/rails-rspec-setup

How do I setup RSpec with a gem that has an activerecord model in it?

We are extracting a few models into a gem so it can be shared among a couple different services and we aren't able to get rspec running in the gem. When we require the gemname in the spec_helper it errors saying:
uninitialized constant Object::ActiveRecord
Some of the file contents are below. Any ideas?
Right now the spec helper is as follows:
require 'rubygems'
require 'bundler/setup'
RSpec.configure do |config|
Bundler.require(:default,"test")
require 'tup-user' # and any other gems you need
end
Our Gemfile is:
source :rubygems
# Specify your gem's dependencies in tup-user.gemspec
gemspec
gem 'rspec-rails'
gem 'aasm'
gem 'authlogic'
gem 'rails'
The line the error is being thrown on is the first of the class:
class User < ActiveRecord::Base
(See comments to question) After getting some good advice on the ruby-talk mailing list, I now require any libraries a file needs within the file itself.

RoR: Testing: undefined local variable or method `be_nil'… but… I included RSpec, spec/spec_helper, spec/matchers, etc

in my environments/test.rb:
config.gem "rspec"
config.gem "rspec-rails"
relevant part of my gemfile:
group :test do
...
gem "rspec", "1.3.2"
gem "rspec-rails", "1.3.2"
in test_helper.rb
require 'test_help'
require "bundler/setup"
Bundler.require(:test)
require 'factory_girl'
require 'shoulda'
require "shoulda-matchers"
require 'spec'
require 'spec/matchers'
I recently moved all my gems to a gemfile, instead of having everything in config.gem's
in my env/test.rb file, I have to use the two config.gem's or my tests don't run at all.
I've read that including spec_helper will help.... but my tests aren't in the spec folder... they are in the test folder... when I include spec/spec_helper.rb, all of my tests get WARNING: already defined.
EDIT: I found this link: https://github.com/rspec/rspec-rails/issues/93
which told me to do
include RSpec::Matchers
and I got a differente error with this one:
/Users/lprestonsegoiii/.rvm/rubies/ruby-1.8.7-p352/lib/ruby/1.8/optparse.rb:314:in `initialize': unhandled exception
EDIT2:
I've discovered through using IRB, that the minimum to use the matchers are:
require "spec/spec_helper"
include RSpec::Matchers
But I still have the duplicate definition issue. hmm.

Resources