rex/mocks/failures/spec/doubles_spec.rb

tests/_examples/rex/mocks/failures/spec/doubles_spec.rb in the metorex repository.

class Mailer
  def deliver(message, to:) = "delivered #{message} to #{to}"
  def self.default_sender = "noreply@example.com"
end

describe "doubles" do
  it "rejects a message a strict double was not told about" do
    mailer = double("mailer")
    mailer.deliver
  end

  it "rejects a message on an anonymous double" do
    double.deliver("hello")
  end

  it "reports an expected message that never arrived" do
    mailer = double("mailer")
    expect(mailer).to receive(:deliver)
  end

  it "reports a message received too many times" do
    mailer = double("mailer")
    expect(mailer).to receive(:deliver).once
    mailer.deliver
    mailer.deliver
  end

  it "reports a message received with other arguments" do
    mailer = double("mailer")
    expect(mailer).to receive(:deliver).with("hello", to: "ada@example.com")
    mailer.deliver("goodbye", to: "ada@example.com")
  end

  it "reports a count that falls short" do
    mailer = double("mailer")
    expect(mailer).to receive(:deliver).exactly(3).times
    mailer.deliver
  end

  it "reports a message that was never to arrive" do
    mailer = double("mailer")
    expect(mailer).not_to receive(:deliver)
    mailer.deliver
  end

  it "reports at_least" do
    mailer = double("mailer")
    expect(mailer).to receive(:deliver).at_least(:twice)
    mailer.deliver
  end

  it "reports a stubbed double given unexpected arguments" do
    mailer = double("mailer")
    allow(mailer).to receive(:deliver).with(1).and_return(:ok)
    mailer.deliver(2)
  end
end

describe "partial doubles" do
  it "reports an expected message on a real object" do
    expect(Mailer).to receive(:default_sender)
  end
end

describe "spies" do
  it "reports a spy that did not receive the message" do
    mailer = spy("mailer")
    expect(mailer).to have_received(:deliver)
  end

  it "reports a spy given other arguments" do
    mailer = spy("mailer")
    mailer.deliver("hello")
    expect(mailer).to have_received(:deliver).with("goodbye")
  end
end

describe "verifying doubles" do
  it "rejects a method the class does not have" do
    instance_double(Mailer, archive: true)
  end

  it "rejects the wrong number of arguments" do
    mailer = instance_double(Mailer)
    allow(mailer).to receive(:deliver)
    mailer.deliver
  end

  it "rejects a class method the class does not have" do
    class_double(Mailer, archive_all: true)
  end

  it "rejects a missing keyword" do
    mailer = instance_double(Mailer)
    allow(mailer).to receive(:deliver)
    mailer.deliver("hello")
  end
end