rspec 3 - stub um método de classe

94

Estou atualizando de rspec 2.99 para rspec 3.0.3 e converti métodos de instância para usar allow_any_instance_of, mas ainda não descobri como criar um método de classe de stub. Eu tenho um código como este:

module MyMod
  class Utils
    def self.find_x(myarg)
      # Stuff
    end
  end
end

e meu teste rspec 2 faz isso:

MyMod::Utils.stub(:find_x).and_return({something: 'testing'})

Qual é a maneira Rspec 3 de fazer isso?

Peter Sankauskas
fonte

Respostas:

172

Você deveria fazer

allow(MyMod::Utils).to receive(:find_x).and_return({something: 'testing'})

Confira os stubs do método doco .

Arup Rakshit
fonte
Estou tentando implementar isso, mas quando escrevo aquele mock e, em seguida expect(Class.foo).to eq(bar), recebo um "erro de número errado de argumentos" porque o foométodo normalmente quer 2 argumentos ... mas eu só quero que ele retorne o que coloquei no esboço
sixty4bit
FWIW, este formulário travaria meu interpretador de rubi. No entanto, and_return não é estritamente necessário e pode ser desativado. (Meu intérprete de rubi também não trava.)
Ray Fix
2
@ sixty4bit Existe uma razão pela qual você não pode chamá-lo com argumentos?
David Moles,
4
@ sixty4bitexpect(Class.foo).to receive(bar).with(arg1, arg2).and_return({..object})
zhisme