Переменные, созданные в инициализаторе, недоступны в тесте, но доступны из консоли (Ruby on Rails) - PullRequest
0 голосов
/ 25 июня 2018

Я создал библиотеку, которую хочу инициализировать один раз при запуске приложения.Итак, я написал инициализатор, который делает это.И этот шов сработает, когда я запускаю консоль rails, но @push_notifications недоступен из моих тестов.Как это может быть?

app / models / post.rb

class Post < ApplicationRecord
  after_save :send_notifications

spec / models / post_spec.rb

require "rails_helper"

RSpec.describe Post, type: :model do
  before(:each) do
    @user = Fabricate(:user)
    @post = Fabricate(:post, user: @user)
  end

  it "is valid from the fabric" do
    expect(@post).to be_valid
  end

lib / push_notifications.rb

class PushNotifications
  def initialize
    puts "PushNotifications#initialize"
    FCM.new(ENV["FCM_SERVER_KEY"])
  end

  def new_post_in_group(post:)
    # [cut...]
  end

config / initializers / PushNotifications.rb

require "#{Rails.root}/lib/push_notifications"

puts "initialize PushNotifications"
@push_notifications ||= PushNotifications.new

$ rails console

initialize PushNotifications
PushNotifications#initialize


[1] pry(main)> @push_notifications
=> #<PushNotifications:0x00007fa22650b250>

выполнение тестов

rspec spec/models/post_spec.rb
initialize PushNotifications
PushNotifications#initialize

Post
  is valid from the fabric (FAILED - 1)

Failures:

  1) Post is valid from the fabric
     Failure/Error: @push_notifications.new_post_in_group(post: self)

     NoMethodError:
       undefined method `new_post_in_group' for nil:NilClass
     # ./app/models/post.rb:85:in `send_notifications'

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

@push_notifications - переменная экземпляра, поэтому она зависит от контекста экземпляра, вам следует присвоить ее константе:

PUSH_NOTIFICATIONS = PushNotifications.new
0 голосов
/ 25 июня 2018

Ваш вопрос не завершен, пожалуйста, включите codenippet спецификации, которая не работает (вывод rspec здесь не очень полезен).

В Pry вы часто находитесь "внутри" объектов, то есть вы можете получить доступ к данным, которые не видны снаружи. Для доступа извне вам может потребоваться attr_reader :push_notifications в соответствующем классе.

Установка переменных экземпляра в инициализаторе, вероятно, не то, что вам нужно. Где должен быть доступен ваш @push_notifications объект? Это то, что вам нужно в ваших контроллерах? Затем вы должны инициализировать и хранить его там (в определенном контроллере или, если необходимо, везде в классе ApplicationController < ActiveRecord::Base, от которого наследуется каждый другой контроллер). Это то, что вам нужно в специальной модели (как в Post), затем определите это там.

Также верно, что ваш класс PushNotification создает объект FCM, но не хранит ссылку на него? Что FCM должен делать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...