2009-10-16 11 views
8

Mam ten kod:rspec Mocks: makiety/wydajność bloku z wywołania metody

Net::SSH.start(@server, @username, :password => @password) do |ssh| 
      output = ssh.exec!(@command) 
      @logger.info 'SSH output: ' 
      @logger.info output 
     end 

mogę mock SSH.Start użyciu mock ramy rspec Like to powiedzieć, że mam rozpocząłem sesję SSH:

Net::SSH.should_receive(:start).with("server", "user", :password => "secret") do 
      @started = true 
     end 

mówi mi to, czy uruchomiłem sesję ssh, czy nie. teraz muszę wyśmiać ssh.exec! Metoda, która jest dość prosta:

Net::SSH.should_receive(:exec!).with("command")...

ale jak zrobić Poddaję/wywołać blok zawierający ssh.exec! wywołanie metody, ponieważ wyśmiałem metodę SSH.start? jest prawdopodobnie jakaś prosta metoda, którą mogę wywołać, aby wykonać ten blok, ale nie wiem co to jest i nie mogę znaleźć żadnych naprawdę dobrych objaśnień/dokumentacji na szyderczym schemacie rspec.

Odpowiedz

19
Net::SSH.should_receive(:start).with(
    "server", "user", :password => "secret").and_yield(
    "whatever value the block should yield") 

Nie wiem, dlaczego trzeba ustawić @started, ponieważ should_receive sprawdza, czy metoda została wywołana.

+0

nie wiedziałem o tym, że powinienem ... dostrzec dobrą dokumentację na ten temat? mój google-fu mnie zawodzi ... także - a co jeśli nie dbam o wartość zwracaną bloku? Po prostu chcę, żeby został wykonany, dzięki czemu mogę wywołać should_receive na ssh.exec! metoda. –

+0

To właśnie oznacza "should_receive": jeśli nie zostanie odebrane, test się nie powiedzie. Jeśli chodzi o dokumentację, RSpec Book jest doskonały. Polecam go zarówno do nauki korzystania z RSpec, jak i do nauki na temat BDD w ogóle. – Avdi

+0

Aha, i możesz być w stanie wywołać '#and_yield()' bez argumentów. – Avdi