Melhor raspar com mocha.

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