Я бы изменил так, чтобы переменные экземпляра устанавливались на основе результата этого вызова функции, а также удалили бы все экземпляры instance_variables из этой функции.
def load_environment_config(gateway, trx_type)
config = YAML.load_file("config/#{env}.yml")["#{env.upcase}"]
raise "\n\nMissing gateway configuration for #{gateway} in file config/#{env}.yml!\n" unless config[gateway]
terminal = terminal_for(config, gateway, trx_type)
url = URI.parse("#{config['processing_url']}#{terminal['token']}")
[ url, terminal, config]
end
# Then whereever you call the loader becomes
@url, @terminal, @config = load_environment_config(some_gateway, some_trx)
С этим изменением, все детали load_environment_configможет быть задет или издеваться
expect(:your_instance).to_receive(:load_environment_config) { [url, terminal, config] }
Вы можете пойти дальше и сделать to_receive with_arguments, если считаете, что это важно для спецификации
Решение, которое не меняет функциональностьload_environment_config
your_instance.stub(:load_environment_config)
your_instance.instance_variable_set(:@config, some_value)
your_instance.instance_variable_set(:@terminal, some_value)
your_instance.instance_variable_set(:@url, some_value)