无法存根外部请求 - 正则表达式错误?



我正在尝试制作一个将所有请求都匹配fcm.googleapis.comstub_request。我们的后端应该在创建新帖子或评论时向其用户发送推送通知。我们的测试会触发大量 fcm.googleapis.com 请求,这就是为什么我需要通用匹配器。

编辑:测试失败,因为我已将stub_request添加到spec_helper。失败的测试不是rspec,而是普通的ActionController::TestCase测试。我的坏!:-|

规格/spec_helper.rb

18 RSpec.configure do |config|
19   require_relative "../test/mock_helper"
20   require "webmock/rspec"
21
22   WebMock.disable_net_connect!
23   config.before(:each) do
24     stub_request(:post, "https://fcm.googleapis.com/fcm/send").
25         with(body: /.*/).
26         to_return(status: 200)
27

但是当我运行测试时,看起来 WebMock 并不关心我的stub_request。可能出了什么问题?

运行测试

Error:
PostsControllerTest#test_should_create_post:
WebMock::NetConnectNotAllowedError: Real HTTP connections are disabled. 
Unregistered request: POST https://fcm.googleapis.com/fcm/send with body 
'{"registration_ids":[null],"notification":
{"title":"Fred Flintstone har skrevet en melding i Bedrock Sportsballteam",
"text":"New post!?"},"data":{"notification":{"avatar":null,"group_id":131900578,
"issued_at":"2018-06-25T13:37:28.746+02:00",
"full_name":"Fred Flintstone","id":700,"post_id":980190963,
"role_id":1}}}' with headers {'Authorization'=>'key=KEY', 'Content-Type'=>'application/json'}
You can stub this request with the following snippet:
stub_request(:post, "https://fcm.googleapis.com/fcm/send").
with(:body => "{"registration_ids":[null],"notification":
{"title":"Fred Flintstone har skrevet en melding i Bedrock Sportsballteam",
"text":"New post!?"},"data":{"notification":
{"avatar":null,"group_id":131900578,
"issued_at":"2018-06-25T13:37:28.746+02:00",
"full_name":"Fred Flintstone","id":700,"post_id":980190963,"role_id":1}}}",
:headers => {'Authorization'=>'key=KEY', 
'Content-Type'=>'application/json'}).
to_return(:status => 200, :body => "", :headers => {})

我的后端应该在创建新帖子更新时向我们的用户发送推送通知。

app/models/post.rb

16 class Post < ApplicationRecord
25   after_save :send_notifications
82   def send_notifications
83     PUSH_NOTIFICATIONS.new_post_in_group(post: self)
84   end

bin/rails 测试测试/控制器/posts_controller_test.rb:57

57   test "should create post" do
58     assert_difference("Post.count") do
59       assert_difference("PostImage.count", 3) do
60         post :create, params: {
61           group_id: groups(:sportsball).id,
62           post: {
63             text: "New post!?",
64             is_pinned: "true"
73           }
74         }
75
76         post = Post.last
77         assert_equal true, post.is_pinned
78
79         assert_response :created, response.body
80         assert valid_json?(response.body), "Invalid json: #{response.body}"
81
82         json = JSON.parse(response.body).deep_symbolize_keys
83         
84       end
85     end
86   end

推送通知

class PushNotifications
def initialize
@fcm = FCM.new(ENV["FCM_SERVER_KEY"])
end
def new_post_in_group(post:)
registration_ids = all_users_except_author(post)
author           = post.user
group            = post.group
return unless registration_ids
options = {
notification: {
title: "#{author.name} har skrevet en melding i #{group.name}",
text: post.text.truncate(27)
},
data: {
notification:
{
avatar: author.avatar,
# comment_id: '646',
group_id: group.id,
issued_at: Time.now,
full_name: author.name,
id: 700, # 700 = new post. The client knows what to do by looking at this id.
post_id: post.id,
role_id: author.role_id(group)
}
}
}
response = @fcm.send(registration_ids, options)
puts "Sendt: #{response}" if ENV["DEBUG"]
end
private
def all_users_except_author(post)
recipients = post.group.users.pluck(:fcm_token)
recipients.delete(post.user.id)
recipients
end
end

config/initializers/PushNotifications.rb

1 require "#{Rails.root}/lib/push_notifications"
2
3 puts "initialize PushNotifications"
4 PUSH_NOTIFICATIONS ||= PushNotifications.new

测试失败,因为我已将stub_request添加到spec_helper。失败的测试不是rspec,而是一个普通的ActionController::TestCase测试。我的坏!:-|

最新更新