Est-il un moyen de stub une méthode d'un module avec Rspec?
J'ai un module qui est inclus dans un autre module, et qu'ils mettent en œuvre la même méthode.
Je tiens à talon la méthode du module, quelque chose comme ceci:
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
Le premier test est de passage, mais la seconde sorties:
Failure/Error: expect(A.foo).to eq :bar
expected: :bar
got: :M
Pourquoi n'est-ce pas le tampon de travail dans ce cas?
Est-il un autre moyen pour y parvenir?
Merci!
-------------------------------------Mise à JOUR----------------------------------
Merci! à l'aide de allow_any_instance_of(M) résolu celui-ci.
Ma prochaine question est - ce qui se passe si j'utilise ajouter et de ne pas inclure? voir le code suivant:
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
Ce temps, à l'aide de allow_any_instance_of(M) résultats dans une boucle infinie. pourquoi est-ce?
Vous devez vous connecter pour publier un commentaire.
Remarque vous ne pouvez pas appeler directement
M.foo
! Votre code ne semble fonctionner parce que vous moqué deM.foo
de retour:bar
.Lorsque vous ouvrez
A
métaclasse (class << self
) pour inclureM
, vous avez à se moquer de n'importe quelle instance deM
, c'est de les ajouter à votrebefore
bloc:allow_any_instance_of(M).to receive(:foo).and_return(:bar)
allow
,allow_any_instance_of
ne nécessite pas la méthode pour être défini sur l'objet.expect_any_instance_of
... ce qui m'a mis sur la bonne voie