uninitialized constant Rspec

geoff swartz picture geoff swartz · Feb 12, 2015 · Viewed 18.4k times · Source

I created a new rails application and followed the installation instructions for rspec-rails here - https://github.com/rspec/rspec-rails I then created (copied from the interwebs) the following module in my app/lib directory.

require 'openssl'
require 'base64'

module Cipher
  def self.encrypt(key, data)
    data += 'A' # Add 'A' suffix to support empty data
    cipher(:encrypt, key, data)
  end

  def self.decrypt(key, text)
    data = cipher(:decrypt, key, text)
    data[0...-1] # Remove the 'A' suffix
  end

  def self.encrypt_base64(key, data)
    blowfish_string = self.encrypt(key, data)
    Base64.encode64(blowfish_string)
  end

  def self.decrypt_base64(key, base64_string)
    blowfish_string = Base64.decode64(base64_string)
    self.decrypt(key, blowfish_string)
  end

  private

  def self.cipher(mode, key, data)
    cipher = OpenSSL::Cipher::Cipher.new('bf-cbc').send(mode)
    cipher.key = Digest::SHA256.digest(key)
    cipher.update(data) << cipher.final
  end
end

Then I created the following spec file.

require 'rails_helper'

Rspec.describe Ciper do

  describe "cipher encrypts data" do
    let(:key) { 'secret key' }

    it "encrypts a string" do
      original = ''
      encrypted = Cipher.encrypt(key, original)
      decrypted = Cipher.decrypt(key, encrypted)
      expect(decrypted).to equal original
    end
  end

end

When I try to run the spec I get the following error

/Users/user/RubymineProjects/skeleton/spec/lib/cipher_spec.rb:3:in `<top (required)>': uninitialized constant Rspec (NameError)
    from /Users/user/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.0/lib/rspec/core/configuration.rb:1226:in `load'
    from /Users/user/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.0/lib/rspec/core/configuration.rb:1226:in `block in load_spec_files'
    from /Users/user/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.0/lib/rspec/core/configuration.rb:1224:in `each'
    from /Users/user/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.0/lib/rspec/core/configuration.rb:1224:in `load_spec_files'
    from /Users/user/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.0/lib/rspec/core/runner.rb:97:in `setup'
    from /Users/user/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.0/lib/rspec/core/runner.rb:85:in `run'
    from /Users/user/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.0/lib/rspec/core/runner.rb:70:in `run'
    from /Users/user/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.0/lib/rspec/core/runner.rb:38:in `invoke'
    from /Users/user/.rvm/gems/ruby-2.2.0/gems/rspec-core-3.2.0/exe/rspec:4:in `<top (required)>'
    from /Users/user/.rvm/gems/ruby-2.2.0/bin/rspec:23:in `load'
    from /Users/user/.rvm/gems/ruby-2.2.0/bin/rspec:23:in `<top (required)>'
    from -e:1:in `load'
    from -e:1:in `<main>'

Process finished with exit code 1
Empty test suite.

I'm not sure what I'm doing wrong here. Can anyone offer some insight on what I can try? Thanks!

Answer

Jake Worth picture Jake Worth · Feb 13, 2015

From the error:

uninitialized constant Rspec (NameError)

In your Cipher spec, you have misspelled RSpec as Rspec. Ruby identifiers are case-sensitive, and you haven't defined Rspec, hence the error.