Mam moduł, który jest zawarty w innym module, i obie implementują tę samą metodę. Chciałbym skrótową metody modułu cenie, coś takiego:Czy istnieje sposób na pobranie metody z dołączonego modułu za pomocą Rspec?
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
Pierwszy test przechodzi, ale drugi wyjścia:
Failure/Error: expect(A.foo).to eq :bar
expected: :bar
got: :M
Dlaczego nie jest obróbka stub w tym przypadku? Czy jest inny sposób na osiągnięcie tego?
Dzięki!
------------------------------------- AKTUALIZACJA -------- --------------------------
Dzięki! użycie parametru allow_any_instance_of (M) rozwiązało ten problem. Moje następne pytanie brzmi: co się stanie, jeśli użyję funkcji przedrostka i nie uwzględnię? patrz poniższy kod:
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
tym razem stosując allow_any_instance_of (M) powoduje w nieskończonej pętli. dlaczego?
To działa. Wygląda na to, że w przeciwieństwie do 'allow',' allow_any_instance_of' nie wymaga zdefiniowania metody na obiekcie. –
Myślę, że to właśnie pomogło mi rozwiązać 5+ godzin, waląc głową w stół. dzięki! – Derek
Cf., 'expect_any_instance_of' ... to postawiło mnie na właściwej drodze –