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