Mam funkcję, która przyjmuje blok, otwiera plik, plony i zyski:Jak przetestować funkcję, która przyjmuje blok z RSpec
def start &block
.....do some stuff
File.open("filename", "w") do |f|
f.write("something")
....do some more stuff
yield
end
end
Próbuję napisać test na to używając RSpec . W jaki sposób I stub plik File.open, aby przekazać obiekt f (dostarczone przeze mnie) do bloku zamiast próbować otworzyć rzeczywisty plik? Coś jak:
it "should test something" do
myobject = double("File", {'write' => true})
File.should_receive(:open).with(&blk) do |myobject|
f.should_receive(:write)
blk.should_receive(:yield) (or somethig like that)
end
end
Trudno to przetestować, ponieważ to, co chcesz przetestować, jest wewnętrzną metodą. W jaki sposób twój plik wchodzi w interakcję z czymkolwiek poza tą metodą? Z Twojego przykładu nie korzystasz w ogóle z pliku spoza metody, a ty go również nie uzyskujesz. Jeśli coś poza tą funkcją potrzebuje pliku, to może warto rozważyć przekazanie obiektu do pliku do metody (wtrysk zależności). Wtedy możesz kpić z pliku bez problemu. Jeśli potrzebujesz przetestować coś na temat tego pliku, może powinieneś rozważyć podzielenie go na osobną metodę? – Raj
Dzięki ... zrobiłem coś takiego, podzielone na wiele metod, zgasiłem kilka funkcji, takich jak File.stub (open) .and_yield (my_double), itp. – constantine1