我创建了一个我想在应用启动时初始化一次的库。
所以我写了一个初始化器来做到这一点。当我启动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'
答案 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
应该做什么?