gpt4 book ai didi

ruby-on-rails - 如何在邮件帮助程序方法上设置 should_receive 期望值?

转载 作者:太空宇宙 更新时间:2023-11-03 16:31:48 24 4
gpt4 key购买 nike

我正在将一个模块混合到一个邮件程序中并将其添加为助手,以便在 View 中可以访问它。我需要测试是否从 View 中调用了正确的辅助方法(以便在电子邮件中包含跟踪像素),但 Rspec 似乎不起作用:

require "spec_helper"

describe DeviseOverrideMailer do

before :each do
# Make the helper accessible.

# This approach does not work
# class MixpanelExposer; include MixpanelFacade end
# @mixpanel = MixpanelExposer.new

# This approach also does not seem to work, but was recommended here: http://stackoverflow.com/questions/10537932/unable-to-stub-helper-method-with-rspec
@mixpanel = Object.new.extend MixpanelFacade
end

describe "confirmation instructions" do
it "tells Mixpanel" do
# Neither of these work.
# DeviseOverrideMailer.stub(:track_confirmation_email).and_return('')
@mixpanel.should_receive(:track_confirmation_email).and_return('')

@sender = create(:confirmed_user)
@email = DeviseOverrideMailer.confirmation_instructions(@sender).deliver

end
end
end

邮寄者:

class DeviseOverrideMailer < Devise::Mailer
include MixpanelFacade
helper MixpanelFacade
end

模块:

class MixpanelFacade
def track_confirmation_email
# Stuff to initialise a Mixpanel connection
# Stuff to add the pixel
end
end

邮件程序 View (HAML):

-# Other HTML content

-# Mixpanel pixel based event tracking
- if should_send_pixel_to_mixpanel?
= track_confirmation_email @resource

错误:它提示它无法正确初始化 Mixpanel 连接(因为缺少请求助手),这表明 .should_receive() 没有正确地 stub track_confirmation_email() 方法。我怎样才能让它正确 stub ?

最佳答案

Rails 通过不公开 Mailer 的实例使这变得困难。请注意我们如何在 Mailers 上定义实例方法,例如 def confirmation_instructions(sender) ... 但我们将它们称为类方法,如下所示:DeviseOverrideMailer.confirmation_instructions(@sender) .这是通过一些method_missing 魔法实现的:

# actionmailer-3.2.11/lib/action_mailer/base.rb 
module ActionMailer
#...
class Base < AbstractController::Base
#...
class << self
#...
#line 437
def method_missing(method, *args) #:nodoc:
return super unless respond_to?(method)
new(method, *args).message
end

注意 new(...).message 创建的一次性实例。我们的 Mailer 被实例化、使用和丢弃,使我们无法从我们的规范中拦截它以进行模拟/ stub 。

我唯一可以建议的是将您想要 stub 的行为提取到一个单独的类方法中,然后 stub 。

# in the helper:
module MixpanelFacade
def track_confirmation_email
Utils.track_confirmation_email(@some_state)
end

module Utils
def self.track_confirmation_email(some_param)
# Stuff to initialise a Mixpanel connection
# Stuff to add the pixel
end
end
end

# in the spec
it "tells Mixpanel" do
MaxpanelFacade::Utils.stub(:track_confirmation_email).and_return('')
@sender = create(:confirmed_user)
@email = DeviseOverrideMailer.confirmation_instructions(@sender).deliver
end

这当然是一个 hack——我们正在提取一个不必要的类方法,这样我们就可以将它 stub ——但我还没有遇到任何其他方法来做到这一点。如果您还没有解决这个问题,那么值得在 rspec 邮件列表上询问(请让我知道他们怎么说:)。

关于ruby-on-rails - 如何在邮件帮助程序方法上设置 should_receive 期望值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14705797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com