No mundo do TDD, qualquer maneira de tornar os testes mais fáceis fico entusiasmado. Aqui está um novo truque que acabei de aprender usando o mocha.
Todos nós conhecemos os benefícios de métodos de stub e fornecer valores de retorno. O que eu não sabia até agora é que mocha #stubs aceita um hash onde as chaves são métodos que serão fragmentados e os valores serão os valores retornados.
Object.stubs(stubbed_method: :return_value)
Se você tiver um método em que um objeto chamará vários métodos antes da conclusão, você pode usar #stubs com um hash para o teste. O exemplo da vida real em que usei isso foi um teste que renderizou uma visão que tinha um objeto chamando uma tonelada de métodos como #nome, #quantidade, ect. Alguns dos métodos eu queria um valor de retorno e outros não me importava, mas eu queria todos eles stubed e eu poderia fazer isso facilmente com stubs e um hash.
Aqui está um exemplo:
Aulas:
require "minitest"
require "mocha"
class Fake
end
class Foo
def bar
fake = Fake.new
[fake.jump("high"), fake.run("fast"), fake.hop("far")]
end
# Defines #jump, #run and #hop for instances of Fake that turns
# the argument passed into a symbol
symbolify = lambda {|arg| arg.to_sym }
%w(jump run hop).each do |meth|
Fake.send(:define_method, meth, &symbolify)
end
end
Testes:
describe Foo do
describe "#bar" do
describe "when stubing out the methods" do
before do
return_a, return_b, return_c = :low, :slow, :near
Fake.any_instance.stubs(
jump: return_a,
run: return_b,
hop: return_c
)
end
it "should return a bunch of mocks" do
Foo.new.bar.must_equal [:low, :slow, :near]
end
end
describe "without stubing the methods" do
it "will return the proper aray" do
Foo.new.bar.must_equal [:high, :fast, :far]
end
end
end
end