We're using Spork with Rspec and if we run Spork, our tests pass, but if we don't start spork and run the test with:
bundle exec rspec spec
Several failures occur, and all of them are the ones using the should.have syntax like:
inactive_user.received_messages.should have(1).message
1) Message introduction messages to active users should be created as messages to both users
Failure/Error: initiator.sent_messages.should have(1).message
expected 1 message, got 6
What's interesting about the number is that that's how many messages are in the database total, so :
initiator.sent_messages.should have(1) == Message.count
Without Spork, if I modify the test like:
inactive_user.received_messages.count.should == 1
everything works fine. So it seems like the matching method is looking at the wrong count. Any idea why this would be?
I have the same problem. I am using shoulda gem to test relationship. I have Instance class that has many WeeklyStatistics and the first time I run :
should have_many(:weekly_statistics)
with spork the test was red indicating that I should set up foreigh key instance_id to the weekly stats but after I have done it the test still failed with the same error - missing association. Then I stopped spork and the test was green.
Related
When running minutest tests, is it possible to peek at the information about the errors that has happened?
For example, this test suite takes ten minutes to complete. But I would like some more info about the letter E appearing in the tests result.
I don't want to wait ten minutes.
*** Running FRONTEND component engine specs
Run options: --seed 29704
# Running:
......................................................................................................................................................................................E...........
That's E for "error", so one of your tests is failing. Normally you get output that explains more. Once you identify which test is failing you can run that test in a more focused capacity, like:
ruby test/unit/broken_test.rb --name=test_that_is_broken
Where that is the path to your test script and the name of the testing method that's failing.
You may need to make your tests self-contained, able to be run this way, by using:
require_relative '../test_helper'
Or whatever the helper stub is that kicks off the testing framework. Some skeleton files contain things like require 'test_helper' which won't be found in your current $LOAD_PATH.
I'm doing an Rspec feature to test some user story and I'm getting the error message:
Internal Server Error uninitialized constant Tree::MY_BRAnCH
Now, I know the test fails because the table "trees" doesn't have the proper rows but only fails when I run the suite test.
RAILS_ENV=test bundle exec rspec spec/
pointing to the articles_spec.rb file as responsible. But if I run just the feature file:
RAILS_ENV=test bundle exec rspec spec/features/articles_spec.rb
the test pass fine. Digging in the code I see other developer made a test with the indication:
before { truncate(Tree) }
So that test is executed first and is removing the data in the table.
My question is: how can avoid this? Need I to reload all the database before each rspec file?
or what policy should we follow to be sure the rspec tests are not affecting other developers?
It seems unlikely that truncating a database table would cause an uninitialized constant error. More likely, articles_spec.rb causes Tree::MY_BRAnCH to be defined. That's why running articles_spec.rb alone passes. When you run the whole spec suite, something tries to use the constant before it has been defined, hence uninitialized constant.
One solution could be to search your codebase for usages of Tree::MY_BRAnCH and make sure that it has been defined before it is used. You may need to learn about one or more of the following code loading techniques:
Kernel#require
Kernel#autoload
ActiveSupport::Autoload
I'm struggling with this for quite a while now: I'm trying to upgrade an app from Rails 3.2 to Rails 4. While on Rails 3.2 all specs are passing, they fail under certain conditions in Rails 4.
Some specs are passing in isolation while failing when run together with other specs.
Example Video
https://www.wingolf.org/ak-internet-files/Spec_Behaviour.mp4 (4 mins)
This example video shows:
Running 3 specs using :focus–––green.
Running them together with another spec–––two specs passing before now fail.
Running the 3 specs, but inserting two empty lines–––one spec fails.
Undo does not help when using guard.
focus/unfocus does not help.
Restarting guard does not help.
Running all specs and then running the 3 specs again does help and make them green again. But adding the other task makes two specs fail, again.
As one can see, some specs are red when run together with other specs. Even entering blank lines can make a difference.
More Observations
For some specs, passing or failing occurs randomly when run several times.
The behavior is not specific to one development machine but can be reproduced on travis.
To delete the database completely between the specs using database_cleaner does not help.
To Rails.cache.clear between the specs does not help.
Wrapping each spec in an ActiveRecord::Base.transaction does not help.
This does occur in Rails 4.0.0 as well as in Rails 4.1.1.
Using this minimal spec_helper.rb without spring or anything does not help.
Using guard vs. using bundle exec rspec some_spec.rb:123 directly doesn't make a difference.
This behavior goes for model specs, thus doesn't have to do anything with parallel database connections for features specs.
I've already tried to keep as many gems at the same version as in the (green) Rails-3.2 branch, including guard, rspec, factory_girl, etc.–––does not help.
Update: Observations Based on Comments & Answers
Thanks to engineerDave, I've inserted require 'pry'; binding.pry; into one of the concerning specs. Using the cd and show-source of pry, it was ingeniously easy and fun to narrow down the problem: Apparently, this has_many :through relation does not return objects when run together with other specs, even when called with (true).
has_many(:groups,
-> { where('dag_links.descendant_type' => 'User').uniq },
through: :memberships,
source: :ancestor, source_type: 'Group'
)
If I call groups directly, I get an empty result. But if I go through the memberships, the correct groups are returned:
#user.groups # => []
#user.groups(true) # => []
#user.memberships.collect { |m| m.group } # returns the correct groups
Has Rails changed the has many through behavior in Rails 4 in a way that could be responsible? (Remember: The spec works in isolation.)
Any help, insights and experiences are appreciated. Thanks very much in advance!
Code
Current master branch on Rails 3.2––all green.
Rails-4 branch––strange behavior.
The file/commit seen in the video––strange behavior.
All specs passing on travis for Rails 3.2.
Diff of the Gemfile.lock (or use git diff master..sf/rails4-minimal-update Gemfile.lock |grep rspec)
How to Reproduce
This is how one can check if the issue still exists:
Preparation
git clone git#github.com:fiedl/wingolfsplattform.git
cd wingolfsplattform
git checkout sf/rails4-minimal-update
bundle install
# please create `config/database.yml` to your needs.
bundle exec rake db:create db:migrate db:test:prepare
Run the specs
bundle exec rspec ./vendor/engines/your_platform/spec/models/user_group_membership_spec.rb
bundle exec rspec ./vendor/engines/your_platform/spec/models/user_group_membership_spec.rb:213
The problem still exists, if the spec :213 is green in the second call but is red when run together with the other specs in the first call.
Based on that you're using:
the should syntax
that you indicate you've upgraded recently (perhaps a bundle update?)
that your failure messages indicate a NilObject error.
Is something like this perhaps what is causing it?
https://stackoverflow.com/a/16427072/793330
Are you are calling an object in your test which hasn't been instantiated yet?
I think this might be an rspec 3 upgrade issue where should is deprecated.
Have you ruled out an rspec gem upgrade to the new rspec 3 syntax (2.99 or 3.0.0+) as the culprit?
"Remove support for deprecated expect(...).should. (Myron Marston)"
IMO this behavior would not be caused by a Rails 4 update as its centered around your test suite.
Update (with pry debug):
Also you could use the pry gem to get a window into what is going on in your specs.
Essentially you can put a big "stop" sign (similar to a debug break) right before the spec executes to get a handle on the environment at that point.
it {
require 'pry'; binding.pry
should == something
}
Although beaware sometimes these pry calls wreck havoc on guard's threading and you have to kill it with CTRL+Z and then kill -9 PID that shows.
Update #2: Looking at updated answer.
You might be running up against FactoryGirl issues based on your has_many issue
You may need to trigger a before action in your Factory to pre-populate the associated record. Although this could get messy, i.e. here be monsters, you can trigger after and before callbacks in your factory that will bring these objects into being.
after(:create) do |instance|
do stuff here
end
I'm trying to get this:
http://www.amazon.com/Dream-Cheeky-902-Electronic-Reference/dp/B004D18MCK
working on a mac using this:
https://github.com/derrick/dream_cheeky
After running rake, it says "4 examples, 0 failures, 2 pending". How do I execute the actual ruby example that I want? (I'm a Ruby noob)
Thanks!
4 examples, 0 failures, 2 pending is a message from RSpec saying there are two unit tests that are pending.
A pending test is generally a test that the author hasn't fully implemented yet. You can think of it like a function that you stubbed out to finish later. For example:
def add_two_numbers(n1, n2)
# TODO write some code that adds n1 and n2
end
As the comments mention, a pending test won't stop you from using the library successful.
Here is an example of pending:
https://www.relishapp.com/rspec/rspec-core/v/2-0/docs/pending/pending-examples
I am following through a simple tutorial and running into the following issue;
Task.create task: 'This is my task'
Returns an error when rspec tries to run it;
ActiveRecord::StatementInvalid:
Could not find table 'tasks'
But when I call the exact same line from the rails console or from a controller the task is created and I am able to see the new row from within the rails console.
Initially I thought it was maybe something going weird with guard, because I have noticed a few odd things (Ctrl+C doesn't kill it for one) but I decided to run the test directly using rspec and it returns the same result.
Any help would be greatly appreciated.
You have to set up and prepare your db first and you can do that by running rake db:test:prepare