mientras trato de verificar internamente, mi método estaba llamando o no en rspec pero obtuvo los siguientes errores
context "#Meeting_schedule" do let(:meeting_schedule) { FactoryGirl.create(:meeting_schedule,:time=>"morning",:schedule_name=>"planned_meet", :schedule_info=>[{ "from"=>"00:00", "to"=>"00:01"}]) } it "if the same schedule was created again dont save it again" do schedule.save params = {:time=>"morning",:schedule_name=>"planned_meet", :schedule_info=>[{ "from"=>"00:00", "to"=>"00:01"}]} meeting_schedule.create_or_update_meeting_schedule(params) expect(meeting_schedule).to receive(:updating_the_user) end end
Tuve el siguiente error
Failure/Error: expect(meeting_schedule.create_or_update_meeting_schedule(params)).to receive(:updating_the_user) (#<Meeting_schedule:0x0055dbaf0da710>).updating_the_user(*(any args)) expected: 1 time with any arguments received: 0 times with any arguments # ./spec/models/meeting_schedule_spec.rb:122:in `block (4 levels)
Entonces, ¿qué estaba mal en mi código?
mi método
def create_or_update_meeting_schedule(params) self.attributes = params if self.changed and self.save updating_the_user end self end
Puede alguien ayudarme
Los simulacros siempre deben configurarse antes de que se llame al método que se está probando, ya que no hay una forma confiable de probar si se llamó a un método normal en Ruby. Hay dos formas de hacer esto en RSpec.
El primero es usar expect(...).to receive(...)
que debe hacerse antes de que se llame al método; esto separa el método y lo reemplaza con un simulacro que envuelve el método original.
La prueba fallará si no se llama al método en el ejemplo.
La segunda es mediante el uso de espías . Puede reemplazar un objeto completo con un espía:
RSpec.describe "have_received" do it "passes when the message has been received" do invitation = spy('invitation') invitation.deliver expect(invitation).to have_received(:deliver) end end
Este "objeto espía" hará un seguimiento de cualquier método que llame.
También puedes espiar con un solo método:
class Invitation def self.deliver; end end RSpec.describe "have_received" do it "passes when the expectation is met" do allow(Invitation).to receive(:deliver) Invitation.deliver expect(Invitation).to have_received(:deliver) end end
Los espías son muy útiles en el caso de que desee simular el método en la configuración de prueba, por ejemplo, en el bloque before
.
class Invitation def self.deliver; end end RSpec.describe "have_received" do before do allow(Invitation).to receive(:deliver) end it "passes when the expectation is met" do Invitation.deliver expect(Invitation).to have_received(:deliver) end end