Здесь есть некоторые методы, которые я не могу увидеть, откуда они пришли, чтобы правильно заглушки, но вы, вероятно, хотите что-то очень близкое к этому, которое проверяет каждый путь кода, значимый для запроса, и его побочные эффекты (отправка электронного письма):
require "spec_helper"
describe "V1::ForgotPasswordsController" do
let(:user) { User.create(email: "user@example.com") }
describe "#create" do
context "with a valid user" do
it "sends an email to the user and acknowledges the request as accepted" do
expect(UserMailer).to receive(:forgot_password).with(user, anything).and_call_original
post v1_create_path, params: { email: user.email }
expect(response).to be_accepted
expect(JSON.parse(response.body)[:message]).to eq I18n.t("forgot_password.send_instructions")
end
end
context "without a valid user" do
it "rejects the request" do
post v1_create_path, params: { email: "not_user@example.com" }
expect(response).to be_unprocessable_entity
expect(JSON.parse(response.body)[:message]).to eq I18n.t("forgot_password.error_email")
end
end
end
describe "#update" do
context "with valid token" do
before { allow_any_instance_of(V1::ForgotPasswordsController).to receive(:token_valid?).and_return(true) }
context "with update_passwords not including false" do
before { allow_any_instance_of(V1::ForgotPasswordsController).to recieve(:update_passwords).and_return([]) }
it "acknowledges the request as accepted" do
put v1_update_path(user), params: { email: user.email }
expect(response).to be_accepted
expect(JSON.parse(response.body)[:message]).to eq I18n.t("forgot_password.updated")
end
end
context "with update_passwords including false" do
before { allow_any_instance_of(V1::ForgotPasswordsController).to recieve(:update_passwords).and_return([false]) }
it "rejects the request" do
put v1_update_path(user), params: { email: user.email }
expect(response).to be_unprocessable_entity
expect(JSON.parse(response.body)[:message]).to eq I18n.t("forgot_password.error_password")
end
end
end
context "with an invalid token" do
before { allow_any_instance_of(V1::ForgotPasswordsController).to receive(:token_valid?).and_return(false) }
it "rejects the request as bad" do
put v1_update_path(user), params: { email: user.email }
expect(response).to be_bad_request
expect(JSON.parse(response.body)[:message]).to eq I18n.t("forgot_password.error_token")
end
end
end
end