Como faço para testar um método é chamado em um controlador Sinatra? - rubi, rspec, sinatra

Estou tentando testar se um método é chamadomeu controlador Sinatra usando Rspec. Estou criando um clone do Twitter para um miniprojeto e quero garantir que toda vez que um novo usuário se inscreva, um e-mail seja enviado.

Isso funciona usando o Mailgun, uma gema de rubi, e os e-mails são enviados assim que um novo usuário se cadastra.

O problema está nos testes.Eu escrevi um método no controlador chamado send_mail que só é chamado quando o usuário se inscreve. Ignore o conteúdo desse método, eles não são tão importantes para os propósitos desta pergunta. Apenas saiba que funciona.

def send_email
RestClient::Request.execute(
url: "https://api:key-7af11fe0adc2a642e55d33744117e7d2"
"@api.mailgun.net/v3/sandbox1aad2b9369f348018e3b435a1026927c.mailgun.org/messages",
:method => :post,
:payload => {
:from => "Mailgun Sandbox <[email protected]>",
:sender => "Mailgun Sandbox <[email protected]>",
:to => params[:email],
:subject => "Welcome to Chitter",
:text => "Welcome to Adrian"s awesome Chitter site. " + params[:username] + ".Get Chittering!",
:multipart => true
},
:headers => {
:"h:X-My-Header" => "www/mailgun-email-send"
},
:verify_ssl => false
)
end

Este método (send_email) é chamado na solicitação de postagem na 8ª linha abaixo.

  post "/users" do
@user = User.create(email: params[:email],
username: params[:username],
password: params[:password],
password_confirmation: params[:password_confirmation])

if @user.save
session[:user_id] = @user.id
send_email
redirect "/peeps"
else
flash.now[:errors] = @user.errors.full_messages
erb :"users/new"
end
end

Escrevi vários testes, um para testar se o aplicativo até responde ao método e outro para testar se o método send_email está sendo chamado quando um novo usuário se inscreve.

describe Chitter do
include Rack::Test::Methods

def app
Chitter.new!
end

it "has send_email method" do
expect(app).to respond_to :send_email
end

it "sends a message to the user when user signs up" do
allow_any_instance_of(RestClient::Request).to receive(:execute).with(any_args)
post "/users", params={email: "[email protected]",
username: "Adrian17",
password: "adrian1",
password_confirmation: "adrian1"}
expect(app).to have_received(:send_email)
end

Nosso primeiro teste passou (o aplicativo deve responder a send_email), mas o segundo não ". A mensagem de erro que recebemos está dizendo que o método não foi stub.

Failure/Error: expect(app).to have_received(:send_email)
#<Chitter:0x007f959e8e3088> expected to have received send_email, but that object is not a spy or method has not been stubbed.

Muitas horas foram gastas nisso, com pares de olhos variados, mas nada que fizemos conseguiu fazer esse teste passar. Alguma orientação sobre onde podemos estar errando?

Respostas:

0 para resposta № 1
it "sends a message to the user when user signs up" do
allow_any_instance_of(RestClient::Request).to receive(:execute).with(any_args)
expect(app).to receive(:send_email)
post "/users", params={email: "[email protected]",
username: "Adrian17",
password: "adrian1",
password_confirmation: "adrian1"}
end

Isso deve fazer você voar!


Cardápio