Some notes, for the public benefit, on some RSpec troubleshooting I’ve been doing lately. The error was ultimately a really dumb error, but the error messages I was getting were not helpful.
My integration tests for Rated R for Rapist had been consistently failing, every last one, even the most basic:
require_relative '../spec_helper_integration'
describe "serving the root page" do
before do
get '/'
end
it "should respond with a 200" do
last_response.should be_ok
end
end
with a somewhat cryptic error:
1) serving the root page should respond with a 200
Failure/Error: get '/'
TypeError:
type mismatch: String given
# ./spec/integration/render_page_spec.rb:5:in `block (2 levels) in <top (required)>'
At first, given that tests were consistently failing when I made a get request, I assumed the issue was some obscure Rack::Test thing, one that perhaps had to do with Sinatra integration and/or regexp parsing. Google was unhelpful on this point, as was reading the Rack::Test source.
What was helpful was going into spechelperintegration.rb.
require 'rack/test'
ENV['RACK_ENV'] = 'test'
require_relative '../server'
# setup test environment
set :environment, :test
set :run, false
set :raise_errors, true
set :logging, false
def app
Sinatra::Application
end
RSpec.configure do |config|
config.include Rack::Test::Methods
end
before(:all) do
DB[:blacklist].multi_insert(YAML.load_file(File.join(File.dirname(__FILE__), 'fixtures', 'blacklist.yml')))
end
Wait, what’s that? A before block outside of an RSpec context? Naturally, putting it in the config block where it belonged solved the problem entirely.
RSpec.configure do |config|
config.include Rack::Test::Methods
config.before(:suite) do
DB[:blacklist].multi_insert(YAML.load_file(File.join(File.dirname(__FILE__), 'fixtures', 'blacklist.yml')))
end
end
Some errors aren’t so puzzling after all. Some day I ought to probably follow up on this, and figure out why it was manifesting in precisely this way. I’m not entirely sure how to patch RSpec to give a more helpful error message in this context, since the error was caused by me defining things out of RSpec’s scope. This is unfortunate.