在初始化程序中创建的变量在测试中不可用,但可以从控制台(Ruby on Rails)访问

时间:2018-06-25 07:45:57

标签: ruby-on-rails ruby rspec

我创建了一个我想在应用启动时初始化一次的库。 所以我写了一个初始化器来做到这一点。当我启动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 :(得分:2)

#include <vector> #include <iostream> using namespace std; int main() { char a = '0'; char b = '4'; vector<char> c; c.push_back(a); c.push_back(b); cout << c.data() << endl; return 0; } 是一个实例变量,因此它与实例上下文相关,您应将其分配给一个常量:

@push_notifications

答案 1 :(得分:0)

您的问题不完整,请提供规范失败的代码片段(rspec的输出在此处不是很有帮助)。

在Pry中,您通常是“内部”对象,这意味着您可以访问从外部看不到的数据。要从外部进行访问,您可能需要在各个类中使用attr_reader :push_notifications

在初始化器中设置实例变量可能不是您想要的。您的@push_notifications对象应从何处获得?您的控制器需要它吗?然后,您应该在那里初始化(并存储)它(在特定控制器中,或者在需要时在其他所有控制器继承的ApplicationController < ActiveRecord::Base类中的任何地方)。 是您在特殊模型(例如Post中)需要的东西,然后在那儿定义它。

您的PushNotification类创建一个FCM对象但不存储对该对象的引用是否正确? FCM应该做什么?