【发布时间】:2014-05-08 11:16:00
【问题描述】:
我为我的应用程序编写了一个电子邮件助手扩展程序。我使用我在应用程序上定义的设置,如下所示:
set :mailgun_options, JSON.parse(File.open('config/mailer.json').read)[ENV['RACK_ENV']]
它将配置设置从 json 文件读取到全局 Sinatra 设置中。
然后我有我的电子邮件助手,它引用这些设置来创建连接等等。
require 'sinatra/base'
require 'faraday'
module Sinatra
module EmailHelper
def connect opts={}
connection = Faraday.new(:url => settings.mailgun_options['mailgun_url']) do |faraday|
if settings.mailgun_options['test']
faraday.adapter :test do |stubs|
stubs.post(settings.mailgun_options['domain'] + '/messages') {[ 200, {}, 'success' ]}
end
else
faraday.request :url_encoded
faraday.adapter Faraday.default_adapter
end
end
connection.basic_auth('api', settings.mailgun_options['key'])
return connection
end
def send_email params={}
connect.post((settings.mailgun_options['domain'] + '/messages'), params)
end
def send_password_reset_email email
template = File.open( File.expand_path( '../../helpers/email_helper/templates/password_reset.erb', __FILE__ ), 'r' ).read
send_email({
:from => 'REscour <noreply@' + settings.mailgun_options['domain'] + '>',
:to => email,
:subject => 'REscour.com Password Reset',
:text => ERB.new(template).result(binding)
})
end
end
end
因此,当我尝试编写规范以测试“连接”方法时,我收到以下错误:
undefined local variable or method `settings' for #<Class:0x007faaf9c9bd18>
我的规范代码如下:
module Sinatra
describe EmailHelper
let(:dummy_class) { Class.new { extend EmailHelper } }
it 'should connect to mailgun\'s api' do
app.set :mailgun_options, ::JSON.parse(File.open('config/mailer.json').read)['test']
puts dummy_class.connect
end
end
end
我不确定如何与我的规范中的全局 Sinatra 设置进行交互,以便在执行帮助程序代码期间定义本地“设置”变量。
据我所知,我的应用程序架构可能在这里出错。有没有人有使用全局设置编写 Sinatra 扩展并为其编写规范的经验?
【问题讨论】:
标签: unit-testing rspec sinatra