Ruby:const_set在块之外?
我想用Ruby模拟一个类 。
如何编写一个处理样板代码的方法?
以下代码:
module Mailgun end module Acani def self.mock_mailgun(mock) temp = Mailgun const_set(:Mailgun, mock) p Mailgun yield ensure const_set(:Mailgun, temp) end end Acani.mock_mailgun('mock') { p Mailgun }
打印:
"mock" Mailgun
这里发生了什么? 为什么Mailgun
在块内部具有原始值? 这与Ruby绑定有关吗?
Ruby版本:2.1.1p76
尝试把Object.
在每个const_set
之前。
问题中的代码已经简化。 这是相关的代码:
测试/ test_helper.rb中
require 'minitest/autorun' module Acani def self.const_mock(const, mock) temp = const_get(const) const_set_silent(const, mock) yield ensure const_set_silent(const, temp) end private def self.const_set_silent(const, value) temp = $VERBOSE $VERBOSE = nil Object.const_set(const, value) ensure $VERBOSE = temp end end
测试/ web_test.rb
require 'test_helper' require 'rack/test' require_relative '../web' class AppTest < MiniTest::Test include Rack::Test::Methods def app Sinatra::Application end def test_password_reset post '/users', {email: 'user1@gmail.com', password: 'password1'} mailgun_mock = MiniTest::Mock.new mailgun_mock.expect(:send, 200, [Hash]) Acani.const_mock(:Mailgun, mailgun_mock) do post '/password_resets', {email: 'user1@gmail.com'} end mailgun_mock.verify assert_equal 201, last_response.status end end