1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
|
require File.join(File.dirname(__FILE__), "..", "test_helper")
require 'method_definer'
require 'mocha/mock'
require 'mocha/class_method'
class ClassMethodTest < Test::Unit::TestCase
include Mocha
def test_should_provide_hidden_version_of_method_name_starting_with_prefix
method = ClassMethod.new(nil, :original_method_name)
assert_match(/^__stubba__/, method.hidden_method)
end
def test_should_provide_hidden_version_of_method_name_ending_with_suffix
method = ClassMethod.new(nil, :original_method_name)
assert_match(/__stubba__$/, method.hidden_method)
end
def test_should_provide_hidden_version_of_method_name_including_original_method_name
method = ClassMethod.new(nil, :original_method_name)
assert_match(/original_method_name/, method.hidden_method)
end
def test_should_provide_hidden_version_of_method_name_substituting_question_mark
method = ClassMethod.new(nil, :question_mark?)
assert_no_match(/\?/, method.hidden_method)
assert_match(/question_mark_substituted_character_63/, method.hidden_method)
end
def test_should_provide_hidden_version_of_method_name_substituting_exclamation_mark
method = ClassMethod.new(nil, :exclamation_mark!)
assert_no_match(/!/, method.hidden_method)
assert_match(/exclamation_mark_substituted_character_33/, method.hidden_method)
end
def test_should_provide_hidden_version_of_method_name_substituting_equals_sign
method = ClassMethod.new(nil, :equals_sign=)
assert_no_match(/\=/, method.hidden_method)
assert_match(/equals_sign_substituted_character_61/, method.hidden_method)
end
def test_should_provide_hidden_version_of_method_name_substituting_brackets
method = ClassMethod.new(nil, :[])
assert_no_match(/\[\]/, method.hidden_method)
assert_match(/substituted_character_91__substituted_character_93/, method.hidden_method)
end
def test_should_provide_hidden_version_of_method_name_substituting_plus_sign
method = ClassMethod.new(nil, :+)
assert_no_match(/\+/, method.hidden_method)
assert_match(/substituted_character_43/, method.hidden_method)
end
def test_should_hide_original_method
klass = Class.new { def self.method_x; end }
method = ClassMethod.new(klass, :method_x)
hidden_method_x = method.hidden_method
method.hide_original_method
assert klass.respond_to?(hidden_method_x)
end
def test_should_respond_to_original_method_name_after_original_method_has_been_hidden
klass = Class.new { def self.original_method_name; end }
method = ClassMethod.new(klass, :original_method_name)
hidden_method_x = method.hidden_method
method.hide_original_method
assert klass.respond_to?(:original_method_name)
end
def test_should_not_hide_original_method_if_method_not_defined
klass = Class.new
method = ClassMethod.new(klass, :method_x)
hidden_method_x = method.hidden_method
method.hide_original_method
assert_equal false, klass.respond_to?(hidden_method_x)
end
def test_should_define_a_new_method_which_should_call_mocha_method_missing
klass = Class.new { def self.method_x; end }
mocha = Mocha::Mock.new
klass.define_instance_method(:mocha) { mocha }
mocha.expects(:method_x).with(:param1, :param2).returns(:result)
method = ClassMethod.new(klass, :method_x)
method.hide_original_method
method.define_new_method
result = klass.method_x(:param1, :param2)
assert_equal :result, result
assert mocha.verified?
end
def test_should_remove_new_method
klass = Class.new { def self.method_x; end }
method = ClassMethod.new(klass, :method_x)
method.remove_new_method
assert_equal false, klass.respond_to?(:method_x)
end
def test_should_restore_original_method
klass = Class.new { def self.method_x; end }
method = ClassMethod.new(klass, :method_x)
hidden_method_x = method.hidden_method.to_sym
klass.define_instance_method(hidden_method_x) { :original_result }
method.remove_new_method
method.restore_original_method
assert_equal :original_result, klass.method_x
assert_equal false, klass.respond_to?(hidden_method_x)
end
def test_should_not_restore_original_method_if_hidden_method_is_not_defined
klass = Class.new { def self.method_x; :new_result; end }
method = ClassMethod.new(klass, :method_x)
method.restore_original_method
assert_equal :new_result, klass.method_x
end
def test_should_call_hide_original_method
klass = Class.new { def self.method_x; end }
method = ClassMethod.new(klass, :method_x)
method.hide_original_method
method.define_instance_accessor(:hide_called)
method.replace_instance_method(:hide_original_method) { self.hide_called = true }
method.stub
assert method.hide_called
end
def test_should_call_define_new_method
klass = Class.new { def self.method_x; end }
method = ClassMethod.new(klass, :method_x)
method.define_instance_accessor(:define_called)
method.replace_instance_method(:define_new_method) { self.define_called = true }
method.stub
assert method.define_called
end
def test_should_call_remove_new_method
klass = Class.new { def self.method_x; end }
klass.define_instance_method(:reset_mocha) { }
method = ClassMethod.new(klass, :method_x)
method.define_instance_accessor(:remove_called)
method.replace_instance_method(:remove_new_method) { self.remove_called = true }
method.unstub
assert method.remove_called
end
def test_should_call_restore_original_method
klass = Class.new { def self.method_x; end }
klass.define_instance_method(:reset_mocha) { }
method = ClassMethod.new(klass, :method_x)
method.define_instance_accessor(:restore_called)
method.replace_instance_method(:restore_original_method) { self.restore_called = true }
method.unstub
assert method.restore_called
end
def test_should_call_reset_mocha
klass = Class.new { def self.method_x; end }
klass.define_instance_accessor(:reset_called)
klass.define_instance_method(:reset_mocha) { self.reset_called = true }
method = ClassMethod.new(klass, :method_x)
method.replace_instance_method(:restore_original_method) { }
method.unstub
assert klass.reset_called
end
def test_should_return_mock_for_stubbee
mocha = Object.new
stubbee = Object.new
stubbee.define_instance_accessor(:mocha) { mocha }
stubbee.mocha = nil
method = ClassMethod.new(stubbee, :method_name)
assert_equal stubbee.mocha, method.mock
end
def test_should_not_be_equal_if_other_object_has_a_different_class
class_method = ClassMethod.new(Object.new, :method)
other_object = Object.new
assert class_method != other_object
end
def test_should_not_be_equal_if_other_class_method_has_different_stubbee
stubbee_1 = Object.new
stubbee_2 = Object.new
class_method_1 = ClassMethod.new(stubbee_1, :method)
class_method_2 = ClassMethod.new(stubbee_2, :method)
assert class_method_1 != class_method_2
end
def test_should_not_be_equal_if_other_class_method_has_different_method
stubbee = Object.new
class_method_1 = ClassMethod.new(stubbee, :method_1)
class_method_2 = ClassMethod.new(stubbee, :method_2)
assert class_method_1 != class_method_2
end
def test_should_be_equal_if_other_class_method_has_same_stubbee_and_same_method_so_no_attempt_is_made_to_stub_a_method_twice
stubbee = Object.new
class_method_1 = ClassMethod.new(stubbee, :method)
class_method_2 = ClassMethod.new(stubbee, :method)
assert class_method_1 == class_method_2
end
def test_should_be_equal_if_other_class_method_has_same_stubbee_and_same_method_but_stubbee_equal_method_lies_like_active_record_association_proxy
stubbee = Class.new do
def equal?(other); false; end
end.new
class_method_1 = ClassMethod.new(stubbee, :method)
class_method_2 = ClassMethod.new(stubbee, :method)
assert class_method_1 == class_method_2
end
end
|