I am trying to run a unit test.
The test needs to have require_relative 'francis'
require 'minitest/autorun'
require_relative 'francis'
class FrancisTest < MiniTest::Test
When I try running rake test TEST=test/francis_test.rb I get an error of
(in C:/Users/chris2/Documents/RailsProjects/francis)
rake aborted!
LoadError: cannot load such file -- C:/Users/chris2/Documents/RailsProjects/francis/test/francis
C:/Users/chris2/Documents/RailsProjects/francis/test/francis_test.rb:2:in `require_relative'
C:/Users/chris2/Documents/RailsProjects/francis/test/francis_test.rb:2:in `<top (required)>'
Tasks: TOP => test:single
(See full trace by running task with --trace)
How can I run this test?
Update
I moved francis_test.rb to the root of the project. I also remarked out the require_relative statement., I also had to change the setup line to #teen = ::Franci.new instead of Francis.new
So the beginning of francis_test looks like
require 'minitest/autorun'
# require_relative 'franci'
require 'test_helper'
class FrancisTest < MiniTest::Test
attr_reader :teen
def setup
#teen = ::Franci.new
end
def test_stating
assert_equal 'Whatevs.', teen.yo('Oh blah di, oh blah da.')
end
def test_yelling
assert_equal 'Chill!', teen.yo('GOOOAAAALLL!')
end
I seem to need require 'test_helper'.
BTW - my ruby and rails versions are
Rails 4.2.5.1
ruby 2.2.4p230 (2015-12-16 revision 53155) [i386-mingw32]
Now if I run rake test TEST=francis_test.rb -v
I see (partial)
# Running:
FrancisTest#test_stating_with_acronyms = 0.01 s = E
FrancisTest#test_inquiring = 0.00 s = E
FrancisTest#test_question_with_just_numbers = 0.00 s = E
. . .
Finished in 0.013518s, 1257.5400 runs/s, 0.0000 assertions/s.
1) Error:
FrancisTest#test_stating_with_acronyms:
ArgumentError: wrong number of arguments (1 for 0)
2) Error:
FrancisTest#test_inquiring:
ArgumentError: wrong number of arguments (1 for 0)
A couple of questions
is attr_reader valid in Ruby 2.2.4? I looked at the API but couldn't quite make sense of it.
Why am I getting 'wrong number of arguments'? I haven't used the attr_reader but it seems that when calling it the way I am, it should be passing the argument to teen.yo.
BTW - the francis table only has one column - 'yo'.
require_relative complements the builtin method require by allowing you to load a file that is relative to the file containing the require_relative statement.
For example, if you have unit test classes in the "test" directory, and data for them under the test "test/data" directory, then you might use a line like this in a test case:
require_relative "data/customer_data_1"
is attr_reader valid in Ruby 2.2.4? I looked at the API but couldn't
quite make sense of it.
Yes, it is. However you don't need it because columns are automatically made available as attributes by ActiveRecord.
Why am I getting 'wrong number of arguments'? I haven't used the
attr_reader but it seems that when calling it the way I am, it should
be passing the argument to teen.yo.
To answer this question, I need the content of your francis.rb file.
Related
I'm new to Ruby and RSpec. I want to create very simple RSpec test:
# test_spec.rb
require 'spec_helper'
describe TestController do
puts(Time.now)
end
But when I run the code this way rspec test_spec.rb I get error:
`<top (required)>': uninitialized constant TestController (NameError)
Can you give me some idea where I'm wrong?
If you pass a class to describe, RSpec attempts to create an instance of that class. If the specified class does not exist, you get an error.
You can pass a string instead:
describe "my first test" do
it "does something" do
expect(1).to be_odd
end
end
Running the above:
$ rspec -fd test_spec.rb
my first test
does something
Finished in 0.00178 seconds (files took 0.10381 seconds to load)
1 example, 0 failures
This error is because after the describe you need a string with the description and you are leaving it without quotes.
describe '3pController' do
puts(Time.now)
end
But the tests should be structured as follows
a (describe) can have many (it) inside (a (it) is where the tests are)
one (decribe) can have more (describe) inside or can have (context), that these at the same time has many (it).
inside this link I will leave the documentation Basic structure
Here you can see a basic example of a test
describe 'sum 2 + 2 equal 4' do
it { expect(2 + 2).to eq(4)}
end
I'm trying to test an RSS feed by comparing a dynamically generated feed against a known output. To make this work, I need to load fixtures with the time frozen. The following works, but it seems overkill to reset the database by reloading the schema and the fixtures.
# test/integration/feed_test.rb
require 'test_helper'
load 'Rakefile'
class FeedTest < ActionDispatch::IntegrationTest
def setup
# Normalize time in order to match fixture file
travel_to Time.zone.parse('2015-03-01T12:00:00') do
silence_stream(STDOUT) do
# anything written to STDOUT here will be silenced
Rake::Task['db:schema:load'].reenable
Rake::Task['db:schema:load'].invoke
end
Rake::Task['db:fixtures:load'].reenable
Rake::Task['db:fixtures:load'].invoke
end
end
test 'feed matches fixture file' do
get feed_path
assert_equal contents('feed.atom'), response.body
end
end
# test/test_helper.rb
module ActiveSupport
class TestCase
fixtures :all
def contents(file_name)
IO.read "test/fixtures/files/#{file_name}"
end
end
end
I can't figure out how to reload just the projects filter inside a travel_to block. I also can't get travel_to to work in test_helper.rb.
But, the real problem with this approach is that reloading the Rakefile causes the following spurious warnings from the secure_headers gem:
$ rake test
/Users/dan/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/secure_headers-3.3.1/lib/tasks/tasks.rake:1: warning: already initialized constant INLINE_SCRIPT_REGEX
/Users/dan/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/secure_headers-3.3.1/lib/tasks/tasks.rake:1: warning: previous definition of INLINE_SCRIPT_REGEX was here
/Users/dan/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/secure_headers-3.3.1/lib/tasks/tasks.rake:2: warning: already initialized constant INLINE_STYLE_REGEX
/Users/dan/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/secure_headers-3.3.1/lib/tasks/tasks.rake:2: warning: previous definition of INLINE_STYLE_REGEX was here
/Users/dan/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/secure_headers-3.3.1/lib/tasks/tasks.rake:3: warning: already initialized constant INLINE_HASH_SCRIPT_HELPER_REGEX
/Users/dan/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/secure_headers-3.3.1/lib/tasks/tasks.rake:3: warning: previous definition of INLINE_HASH_SCRIPT_HELPER_REGEX was here
/Users/dan/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/secure_headers-3.3.1/lib/tasks/tasks.rake:4: warning: already initialized constant INLINE_HASH_STYLE_HELPER_REGEX
/Users/dan/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/secure_headers-3.3.1/lib/tasks/tasks.rake:4: warning: previous definition of INLINE_HASH_STYLE_HELPER_REGEX was here
Run options: --seed 17868
# Running:
........................................................................................................
Finished in 17.397614s, 5.9778 runs/s, 191.3481 assertions/s.
104 runs, 3329 assertions, 0 failures, 0 errors, 0 skips
Coverage report generated for MiniTest to /Users/dan/Dropbox/Documents/dev/cii-best-practices-badge/coverage. 754 / 781 LOC (96.54%) covered.
It seems like I should be able to reload some of the fixtures without using rake at all, but I can't figure out how to do so.
Here's the fix that resolved my issue:
# frozen_string_literal: true
require 'test_helper'
load 'Rakefile'
class FeedTest < ActionDispatch::IntegrationTest
# Turn off transactional fixtures for this test since we are loading
# the fixtures database anyway. This will prevent the timestamp change
# from spilling into other tests.
self.use_transactional_tests = false
setup do
# Ensure the test db has its environment metadata set to test,
# otherwise tasks farther down will fail. New for Rails 5
Rake::Task['db:environment:set'].invoke
# Normalize time in order to match fixture file
travel_to Time.zone.parse('2015-03-01T12:00:00') do
ActiveRecord::Schema.verbose = false
Rake::Task['db:schema:load'].reenable
Rake::Task['db:schema:load'].invoke
Rake::Task['db:fixtures:load'].reenable
Rake::Task['db:fixtures:load'].invoke
end
end
test 'feed matches fixture file' do
get feed_path
assert_equal contents('feed.atom'), response.body
end
end
There is need to build a rspec framework where in we don't want to write feature files and respective step definitions, to run our tests.
So far this is what I have tried this is test run, if it works I will write more.
my_example_spec.rb
require 'rspec'
describe 'Mybehaviour' do
def testMethod
visit(LoginPage).test
end
end
login_page.rb
class LoginPage
include PageObject
page_url("#{FigNewton.base_url}/login")
element :username, "input[id='username']"
element :password, "input[id='password']"
element :submit, "input[id='submit']"
def test
puts "excellent"
end
end
I am using Rubymine when I right click my example file and run it , it gives me
Run options: include {:full_description=>/Mybehaviour/}
All examples were filtered out
0 examples, 0 failures, 0 passed
Finished in 0.000315 seconds
Process finished with exit code 0
Empty test suite.
So I changed it too:
require 'rspec'
describe 'Mybehaviour' do
it 'test Method' do
visit(LoginPage).test
true.should == false
end
end
it gives me:
Run options: include {:full_description=>/Mybehaviour/}
NameError: uninitialized constant LoginPage
./my_example_spec.rb:6:in `block (2 levels) in <top (required)>'
-e:1:in `load'
-e:1:in `<main>'
1 example, 1 failure, 0 passed
Finished in 0.001273 seconds
Process finished with exit code 1
What is the difference when I was using def and when I used it?
I understand that I need to initialize LoginPage, but where and why it is calling it as constant LoginPage instead of class LoginPage.
PS:New to rspec
My guess is you need to require login_page.rb in your spec_helper.rb (if you have one), or at the top of my_example_spec.rb
The test doesn't know about the LoginPage class, and so when it hits visit(LoginPage).test on line 6 it thinks LoginPage is an undefined constant. It doesn't know that you have defined it as a class.
Try adding:
require 'login_page'
either in your spec_helper.rb or after require 'rspec' in my_example_spec.rb
I was stuck with error when i run very simple test with minitest-rails gem.
I have rails 4.1.5 and minitest 5.4.0
rake test:controllers
1) Error:
DashboardController::index action#test_0001_anonymous:
NoMethodError: undefined method get' for #<#<Class:0x00000008e28170>:0x00000008eeb9b8>
test/controllers/dashboard_controller_test.rb:6:inblock (3 levels) in '
Test:
require "test_helper"
describe DashboardController do
context "index action" do
before do
get :index
end
it { must_respond_with :success }
it "must render index view" do
must_render_template :index
end
end
end
My test_helper:
ENV["RAILS_ENV"] = "test"
require File.expand_path("../../config/environment", __FILE__)
require "rails/test_help"
require "minitest/rails"
require "minitest/rails/capybara"
class MiniTest::Spec
class << self
alias :context :describe
end
end
class RequestTest < MiniTest::Spec
include Rails.application.routes.url_helpers
register_spec_type(/request$/, self)
end
class ActionDispatch::IntegrationTest
# Register "request" tests to be handled by IntegrationTest
register_spec_type(/Request( ?Test)?\z/i, self)
end
class ActiveSupport::TestCase
ActiveRecord::Migration.check_pending!
# Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
#
# Note: You'll currently still have to declare fixtures explicitly in integration tests
# -- they do not yet inherit this setting
fixtures :all
# Add more helper methods to be used by all tests here...
extend MiniTest::Spec::DSL
end
There are many things wrong with what you are doing. As I understand it you want to use Minitest's spec DSL in your Rails tests, correct? It looks like you are doing things to accomplish this that you don't need to do. I don't understand why half that code in your test_helper.rb file is there. I also suspect that you have other code doing things that are not being shown.
Here is what I did to reproduce your setup:
$ echo "Creating a new Rails app"
☣ [rails41:rails41] $ rails new undefined_get
☣ [rails41:rails41] $ cd undefined_get/
$ echo "Generate a Dashboard controller"
$ rails g controller dashboard index
$ echo "Add minitest-rails dependencies"
$ echo 'gem "minitest-rails"' >> Gemfile
$ echo 'gem "minitest-rails-capybara"' >> Gemfile
$ bundle install
$ echo "The test runs fine now:"
$ rake test
Run options: --seed 47210
# Running:
.
Finished in 0.457972s, 2.1835 runs/s, 2.1835 assertions/s.
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
$ echo "Update to your test code and test_helper code"
$ echo "Use whatever editor you want. Not shown here."
$ echo "Now rerun the tests:"
$ rake test
rake aborted!
NoMethodError: undefined method `context' for #<Class:0x007f860258ae50>
The error I get is different than yours. You aliased the method context to describe in your test_helper.rb file, but unfortunately the object you aliased is not in the inheritance chain for the rails test objects. The rails test objects extend Minitest::Spec::DSL, but they do not inherit from Minitest::Spec. So, I am strongly suspicious that the code you provided is indeed producing the results you have presented. That said, here is the code in my test_helper.rb that will run your test:
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require "minitest/rails"
require "minitest/rails/capybara"
class ActiveSupport::TestCase
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
fixtures :all
# Allow context to be used like describe
class << self
alias :context :describe
end
# Add more helper methods to be used by all tests here...
end
This is the standard test_helper.rb with two changes. First, it has the requires for minitest-rails and minitest-rails-capybara. That is all you need to do in order to enable the Minitest spec DSL in your rails tests. Second, it adds the alias for context to describe on ActiveSupport::TestCase, which is the basis for all the rails tests. If you want to add tests that do not inherit from ActiveSupport::TestCase then you can also alias it on Minitest::Spec, but that will not help you use context within your controller tests.
Still here? Okay. So why did your code give you a different error than mine? Likely the test object used for your controller tests isn't ActionController::TestCase. I say that because your error was undefined method get. The get method is something that ActionController::TestCase defines, and is not on Minitest::Spec. So, you somehow messed up your Minitest configuration. A simple way to make sure that your tests are using the correct test objects is to add an additional assertion to your test. Like this:
require "test_helper"
describe DashboardController do
context "index action" do
before do
# Make sure we are using the correct test class
self.class.ancestors.must_include ActionController::TestCase
# Continue with setup
get :index
end
it { must_respond_with :success }
it "must render index view" do
must_render_template :index
end
end
end
If that first assertion fails then you know you have done something wrong in your configuration.
I have posted this in other places but no response. Trying to get Shoulda working inside Test/Unit in Rails 3.0.3 (1.9.2). When I try to run the test (copied below), I get this error:
test/unit/practice_member_test.rb:4:in <class:PracticeMemberTest>': undefined methodcontext' for PracticeMemberTest:Class (NoMethodError)
Note that I have another Rails 3 project with Rspec including Shoulda also and it works fine via Rspec. In the failing project I tried placing "require 'shoulda'" in test helper to no avail, but when I run the debugger and type Shoulda, the object is found, so the library is being loaded.
Here is my test:
require 'test_helper'
class PracticeMemberTest < Test::Unit::TestCase
context "practice member" do
should "get global practice member count not including Demo Practice" do
assert_equal PracticeMember.practice_members_global_count, 0
practice = Factory.create(:practice_one)
practice_member = Factory.create(:practice_member)
practice_member.practice_id = practice.id
practice_member.save
practice_member = Factory.create(:practice_member)
practice_member.practice_id = practice.id
practice_member.save
assert_equal PracticeMember.practice_members_global_count, 2
end
end
end
Must be something I am overlooking as I have not seen anyone with this same issue.
Did you try adding the following to your config/environment.rb file:
Rails::Initializer.run do |config|
config.gem "shoulda", :lib => "shoulda"
end
Then
$ rake gems:install
$ rake gems:unpack
As suggested in the documentation?