Sinatraコントローラでメソッドが呼び出されるようにテストするにはどうすればよいですか? - ルビー、rspec、シナトラ

メソッドが呼び出されることをテストしようとしています私のSinatraコントローラはRspecを使用しています。私はミニプロジェクトのためにTwitterのクローンを作成し、新しいユーザーがサインアップするたびに電子メールが送信されるようにしたいと考えています。

これはRubyの宝石であるMailgunを使って動作し、新しいユーザーがサインアップすると電子メールが送信されます。

問題はテスト中です。私はsend_mailというコントローラに、ユーザーがサインアップしたときにのみ呼び出されるメソッドを作成しました。このメソッドの内容を無視して、この質問の目的にとって重要ではありません。それが動作することだけを知っている。

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

このメソッド(send_email)は、以下の8行目のポストリクエストで呼び出されます。

  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

私はたくさんのテストを書いています.1つはメソッドがメソッドに応答することをテストするメソッド、もう1つは新しいユーザーがサインアップするときにsend_emailメソッドが呼び出されることをテストするメソッドです。

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

私たちの最初のテストは成功します(アプリケーションはsend_emailに応答するはずです)が、2番目のテストは失敗します。エラーメッセージは、メソッドがスタブされていないということです。

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.

これには多くの時間が費やされていますが、さまざまな目でそれを行っていますが、私たちが行っていることは何もこのテストに合格していません。私たちが間違っている場所についてのガイダンスはありますか?

回答:

回答№1は0
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

それはあなたを飛ばす必要があります!


関連する質問
メニュー
最も人気のある