¿Hay alguna manera de eliminar un método de un módulo incluido con Rspec?

Tengo un módulo que está incluido en otro módulo, y ambos implementan el mismo método. Me gustaría poner el método del módulo incluido, algo como esto:

module M
  def foo
    :M
  end
end

module A
  class << self
    include M

    def foo
      super
    end
  end
end

describe "trying to stub the included method" do
  before { allow(M).to receive(:foo).and_return(:bar) }

  it "should be stubbed when calling M" do
    expect(M.foo).to eq :bar
  end

  it "should be stubbed when calling A" do
    expect(A.foo).to eq :bar
  end
end

La primera prueba está pasando, pero la segunda sale:

Failure/Error: expect(A.foo).to eq :bar

   expected: :bar
        got: :M

¿Por qué el trozo no funciona en este caso? ¿Hay una manera diferente de lograr esto?

¡Gracias!

-------------------------------------ACTUALIZAR------------ ----------------------

¡Gracias! usando allow_any_instance_of (M) resolvió este. Mi siguiente pregunta es: ¿qué sucede si uso prepend y no include? ver el siguiente código:

module M
  def foo
    super
  end
end

module A
  class << self
    prepend M

    def foo
      :A
    end
  end
end

describe "trying to stub the included method" do
  before { allow_any_instance_of(M).to receive(:foo).and_return(:bar) }

  it "should be stubbed when calling A" do
    expect(A.foo).to eq :bar
  end
end 

Esta vez, usar allow_any_instance_of (M) da como resultado un bucle infinito. ¿porqué es eso?

Respuestas a la pregunta(1)

Su respuesta a la pregunta