Interview

10 RSpec Interview Questions and Answers

Prepare for your Ruby interview with this guide on RSpec. Learn common questions and answers to enhance your testing skills and confidence.

RSpec is a popular testing framework for Ruby, designed to help developers write and execute test cases with ease. Known for its readability and flexibility, RSpec allows for behavior-driven development (BDD), making it easier to ensure that code meets the specified requirements and behaves as expected. Its syntax is intuitive, enabling developers to write tests that are both expressive and maintainable.

This article offers a curated selection of RSpec interview questions and answers to help you prepare effectively. By familiarizing yourself with these questions, you’ll gain a deeper understanding of RSpec’s capabilities and best practices, positioning yourself as a strong candidate in technical interviews.

RSpec Interview Questions and Answers

1. Explain the difference between describe and context blocks. When would you use each?

In RSpec, describe and context blocks help organize test cases.

– The describe block groups related tests, typically around a class or method, outlining the behavior of the object or method under test.
– The context block, used within a describe block, sets up different scenarios or conditions for the tests, enhancing readability by clearly defining the context.

Example:

RSpec.describe Calculator do
  describe '#add' do
    context 'when both numbers are positive' do
      it 'returns the sum of the numbers' do
        calculator = Calculator.new
        expect(calculator.add(2, 3)).to eq(5)
      end
    end

    context 'when one number is negative' do
      it 'returns the sum of the numbers' do
        calculator = Calculator.new
        expect(calculator.add(-2, 3)).to eq(1)
      end
    end
  end
end

In this example, describe groups tests for the add method, while context defines different scenarios, making tests organized and readable.

2. Write an RSpec test to verify that a method #calculate raises an error when given invalid input.

RSpec is a testing tool for Ruby. To verify that a method #calculate raises an error with invalid input, you can use the raise_error matcher.

Example:

class Calculator
  def calculate(input)
    raise ArgumentError, "Invalid input" unless input.is_a?(Numeric)
  end
end

RSpec.describe Calculator do
  describe '#calculate' do
    it 'raises an error when given invalid input' do
      calculator = Calculator.new
      expect { calculator.calculate("invalid") }.to raise_error(ArgumentError, "Invalid input")
    end
  end
end

3. Describe how you would test exceptions in RSpec. Provide a code example.

Testing exceptions in RSpec is straightforward with the raise_error matcher, which specifies the expected exception type and message.

Example:

def divide(a, b)
  raise ArgumentError, 'Division by zero' if b == 0
  a / b
end

RSpec.describe 'divide' do
  it 'raises an error when dividing by zero' do
    expect { divide(4, 0) }.to raise_error(ArgumentError, 'Division by zero')
  end
end

4. How do you mock and stub methods in RSpec? Provide an example where you mock a method call.

In RSpec, mocking and stubbing simulate object behavior. Mocking creates objects that mimic real ones, while stubbing specifies method return values during a test.

Example:

class User
  def initialize(name)
    @name = name
  end

  def greet
    "Hello, #{@name}!"
  end
end

RSpec.describe User do
  it 'mocks the greet method' do
    user = User.new('Alice')
    allow(user).to receive(:greet).and_return('Hello, mocked user!')

    expect(user.greet).to eq('Hello, mocked user!')
  end
end

In this example, the greet method is mocked to return a different string, allowing the test to focus on dependent code behavior.

5. Write an RSpec test to check if a method #fetch_data makes an HTTP request to a specific URL.

To test if a method #fetch_data makes an HTTP request to a specific URL, use the WebMock gem.

Example:

require 'webmock/rspec'

describe MyClass do
  describe '#fetch_data' do
    it 'makes an HTTP request to the specific URL' do
      url = 'http://example.com/data'
      stub_request(:get, url)

      MyClass.new.fetch_data

      expect(WebMock).to have_requested(:get, url).once
    end
  end
end

6. How do you use shared examples in RSpec? Provide an example scenario where shared examples would be useful.

Shared examples in RSpec define reusable tests for different contexts, ensuring consistent testing without code duplication.

Example:

# spec/support/shared_examples_for_users.rb
RSpec.shared_examples "a user with a role" do
  it "responds to #role" do
    expect(subject).to respond_to(:role)
  end

  it "returns the correct role" do
    expect(subject.role).to eq(expected_role)
  end
end

# spec/models/admin_user_spec.rb
require 'spec_helper'
require 'support/shared_examples_for_users'

RSpec.describe AdminUser, type: :model do
  let(:expected_role) { 'admin' }
  subject { described_class.new }

  it_behaves_like "a user with a role"
end

# spec/models/regular_user_spec.rb
require 'spec_helper'
require 'support/shared_examples_for_users'

RSpec.describe RegularUser, type: :model do
  let(:expected_role) { 'regular' }
  subject { described_class.new }

  it_behaves_like "a user with a role"
end

7. Describe a situation where you might use RSpec::Mocks::Double and provide a code example.

RSpec::Mocks::Double creates test doubles, simulating real objects to isolate the behavior of the object under test.

Example:

class OrderProcessor
  def initialize(payment_gateway)
    @payment_gateway = payment_gateway
  end

  def process(order)
    @payment_gateway.charge(order.total)
  end
end

RSpec.describe OrderProcessor do
  it 'charges the order total using the payment gateway' do
    payment_gateway = double('PaymentGateway')
    order = double('Order', total: 100)

    expect(payment_gateway).to receive(:charge).with(100)

    processor = OrderProcessor.new(payment_gateway)
    processor.process(order)
  end
end

In this example, payment_gateway and order are doubles, allowing isolated testing of OrderProcessor.

8. How do you create and use custom matchers in RSpec? Provide an example.

Custom matchers in RSpec define domain-specific expectations, enhancing test readability.

Example:

RSpec::Matchers.define :be_a_multiple_of do |expected|
  match do |actual|
    actual % expected == 0
  end

  failure_message do |actual|
    "expected that #{actual} would be a multiple of #{expected}"
  end

  failure_message_when_negated do |actual|
    "expected that #{actual} would not be a multiple of #{expected}"
  end
end

RSpec.describe 'Custom Matcher: be_a_multiple_of' do
  it 'checks if a number is a multiple of another number' do
    expect(10).to be_a_multiple_of(2)
    expect(10).not_to be_a_multiple_of(3)
  end
end

In this example, be_a_multiple_of checks if one number is a multiple of another.

9. How do you use metadata in RSpec to organize your tests? Provide an example.

Metadata in RSpec adds information to tests, aiding in organization and filtering.

Example:

RSpec.describe 'User management', :type => :feature do
  it 'creates a new user', :focus do
    # test code for creating a new user
  end

  it 'deletes a user', :slow do
    # test code for deleting a user
  end
end

RSpec.describe 'Order processing', :type => :model do
  it 'processes an order', :focus do
    # test code for processing an order
  end

  it 'cancels an order', :slow do
    # test code for canceling an order
  end
end

Tests are tagged with metadata like :focus and :slow, allowing specific test execution using tags.

10. How do you tag tests in RSpec and why is it useful? Provide an example.

Tagging tests in RSpec uses metadata to filter which tests to run.

Example:

RSpec.describe 'An example group' do
  it 'is a fast test', :fast do
    expect(1 + 1).to eq(2)
  end

  it 'is a slow test', :slow do
    sleep 5
    expect(1 + 1).to eq(2)
  end
end

To run only fast tests, use:

rspec --tag fast

This executes tests tagged with :fast.

Previous

10 Informatics Interview Questions and Answers

Back to Interview
Next

10 Formal Verification Interview Questions and Answers