Skip to content

Commit ade4b6e

Browse files
kjcmpirnat
authored andcommitted
Unmockify (gregmalcolm#141)
* Removed unneeded mocks from mountain and sensei tests. Some of the Mock objects "leaked out" into other tests, especially runner.path_to_enlightenment.koans, which was untestable after it had been replaced with a Mock. * Globally-visible Mocks -> "with patch():" blocks. Python 2 and 3: test_sensei.py replaced some methods of runner.mockable_test_result.MockableTestResult with new Mock objects. I did not experience these "leaking" into other tests, but they could have. Also, removed unused "import sys" from both 2 and 3 versions.
1 parent d44aec5 commit ade4b6e

File tree

4 files changed

+35
-68
lines changed

4 files changed

+35
-68
lines changed

python2/runner/runner_tests/test_mountain.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,14 @@
55
from libs.mock import *
66

77
from runner.mountain import Mountain
8-
from runner import path_to_enlightenment
98

109
class TestMountain(unittest.TestCase):
1110

1211
def setUp(self):
13-
path_to_enlightenment.koans = Mock()
1412
self.mountain = Mountain()
15-
self.mountain.stream.writeln = Mock()
1613

1714
def test_it_gets_test_results(self):
18-
self.mountain.lesson.learn = Mock()
19-
self.mountain.walk_the_path()
20-
self.assertTrue(self.mountain.lesson.learn.called)
21-
15+
with patch_object(self.mountain.stream, 'writeln', Mock()):
16+
with patch_object(self.mountain.lesson, 'learn', Mock()):
17+
self.mountain.walk_the_path()
18+
self.assertTrue(self.mountain.lesson.learn.called)

python2/runner/runner_tests/test_sensei.py

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#!/usr/bin/env python
22
# -*- coding: utf-8 -*-
33

4-
import sys
54
import unittest
65
import re
76

@@ -10,7 +9,6 @@
109
from runner.sensei import Sensei
1110
from runner.writeln_decorator import WritelnDecorator
1211
from runner.mockable_test_result import MockableTestResult
13-
from runner import path_to_enlightenment
1412

1513
class AboutParrots:
1614
pass
@@ -81,36 +79,33 @@ class AboutFreemasons:
8179
8280
"""
8381

82+
8483
class TestSensei(unittest.TestCase):
8584

8685
def setUp(self):
87-
self.sensei = Sensei(WritelnDecorator(sys.stdout))
88-
self.sensei.stream.writeln = Mock()
89-
path_to_enlightenment.koans = Mock()
90-
self.tests = Mock()
91-
self.tests.countTestCases = Mock()
86+
self.sensei = Sensei(WritelnDecorator(Mock()))
9287

9388
def test_that_failures_are_handled_in_the_base_class(self):
94-
MockableTestResult.addFailure = Mock()
95-
self.sensei.addFailure(Mock(), Mock())
96-
self.assertTrue(MockableTestResult.addFailure.called)
89+
with patch('runner.mockable_test_result.MockableTestResult.addFailure', Mock()):
90+
self.sensei.addFailure(Mock(), Mock())
91+
self.assertTrue(MockableTestResult.addFailure.called)
9792

9893
def test_that_it_successes_only_count_if_passes_are_currently_allowed(self):
99-
self.sensei.passesCount = Mock()
100-
MockableTestResult.addSuccess = Mock()
101-
self.sensei.addSuccess(Mock())
102-
self.assertTrue(self.sensei.passesCount.called)
94+
with patch('runner.mockable_test_result.MockableTestResult.addSuccess', Mock()):
95+
self.sensei.passesCount = Mock()
96+
self.sensei.addSuccess(Mock())
97+
self.assertTrue(self.sensei.passesCount.called)
10398

10499
def test_that_it_passes_on_add_successes_message(self):
105-
MockableTestResult.addSuccess = Mock()
106-
self.sensei.addSuccess(Mock())
107-
self.assertTrue(MockableTestResult.addSuccess.called)
100+
with patch('runner.mockable_test_result.MockableTestResult.addSuccess', Mock()):
101+
self.sensei.addSuccess(Mock())
102+
self.assertTrue(MockableTestResult.addSuccess.called)
108103

109104
def test_that_it_increases_the_passes_on_every_success(self):
110-
pass_count = self.sensei.pass_count
111-
MockableTestResult.addSuccess = Mock()
112-
self.sensei.addSuccess(Mock())
113-
self.assertEqual(pass_count + 1, self.sensei.pass_count)
105+
with patch('runner.mockable_test_result.MockableTestResult.addSuccess', Mock()):
106+
pass_count = self.sensei.pass_count
107+
self.sensei.addSuccess(Mock())
108+
self.assertEqual(pass_count + 1, self.sensei.pass_count)
114109

115110
def test_that_nothing_is_returned_as_a_first_result_if_there_are_no_failures(self):
116111
self.sensei.failures = []
@@ -236,58 +231,50 @@ def test_that_if_there_are_0_successes_it_will_say_the_first_zen_of_python_koans
236231
self.sensei.pass_count = 0
237232
self.sensei.failures = Mock()
238233
words = self.sensei.say_something_zenlike()
239-
240234
m = re.search("Beautiful is better than ugly", words)
241235
self.assertTrue(m and m.group(0))
242236

243237
def test_that_if_there_is_1_successes_it_will_say_the_second_zen_of_python_koans(self):
244238
self.sensei.pass_count = 1
245239
self.sensei.failures = Mock()
246240
words = self.sensei.say_something_zenlike()
247-
248241
m = re.search("Explicit is better than implicit", words)
249242
self.assertTrue(m and m.group(0))
250243

251244
def test_that_if_there_is_10_successes_it_will_say_the_sixth_zen_of_python_koans(self):
252245
self.sensei.pass_count = 10
253246
self.sensei.failures = Mock()
254247
words = self.sensei.say_something_zenlike()
255-
256248
m = re.search("Sparse is better than dense", words)
257249
self.assertTrue(m and m.group(0))
258250

259251
def test_that_if_there_is_36_successes_it_will_say_the_final_zen_of_python_koans(self):
260-
self.sensei.pass_count = 36
261252
self.sensei.failures = Mock()
253+
self.sensei.pass_count = 36
262254
words = self.sensei.say_something_zenlike()
263-
264255
m = re.search("Namespaces are one honking great idea", words)
265256
self.assertTrue(m and m.group(0))
266257

267258
def test_that_if_there_is_37_successes_it_will_say_the_first_zen_of_python_koans_again(self):
268259
self.sensei.pass_count = 37
269260
self.sensei.failures = Mock()
270261
words = self.sensei.say_something_zenlike()
271-
272262
m = re.search("Beautiful is better than ugly", words)
273263
self.assertTrue(m and m.group(0))
274264

275265
def test_that_total_lessons_return_7_if_there_are_7_lessons(self):
276266
self.sensei.filter_all_lessons = Mock()
277267
self.sensei.filter_all_lessons.return_value = [1,2,3,4,5,6,7]
278-
279268
self.assertEqual(7, self.sensei.total_lessons())
280269

281270
def test_that_total_lessons_return_0_if_all_lessons_is_none(self):
282271
self.sensei.filter_all_lessons = Mock()
283272
self.sensei.filter_all_lessons.return_value = None
284-
285273
self.assertEqual(0, self.sensei.total_lessons())
286274

287275
def test_total_koans_return_43_if_there_are_43_test_cases(self):
288276
self.sensei.tests.countTestCases = Mock()
289277
self.sensei.tests.countTestCases.return_value = 43
290-
291278
self.assertEqual(43, self.sensei.total_koans())
292279

293280
def test_filter_all_lessons_will_discover_test_classes_if_none_have_been_discovered_yet(self):

python3/runner/runner_tests/test_mountain.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,14 @@
55
from libs.mock import *
66

77
from runner.mountain import Mountain
8-
from runner import path_to_enlightenment
98

109
class TestMountain(unittest.TestCase):
1110

1211
def setUp(self):
13-
path_to_enlightenment.koans = Mock()
1412
self.mountain = Mountain()
15-
self.mountain.stream.writeln = Mock()
1613

1714
def test_it_gets_test_results(self):
18-
self.mountain.lesson.learn = Mock()
19-
self.mountain.walk_the_path()
20-
self.assertTrue(self.mountain.lesson.learn.called)
21-
15+
with patch_object(self.mountain.stream, 'writeln', Mock()):
16+
with patch_object(self.mountain.lesson, 'learn', Mock()):
17+
self.mountain.walk_the_path()
18+
self.assertTrue(self.mountain.lesson.learn.called)

python3/runner/runner_tests/test_sensei.py

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#!/usr/bin/env python
22
# -*- coding: utf-8 -*-
33

4-
import sys
54
import unittest
65
import re
76

@@ -10,7 +9,6 @@
109
from runner.sensei import Sensei
1110
from runner.writeln_decorator import WritelnDecorator
1211
from runner.mockable_test_result import MockableTestResult
13-
from runner import path_to_enlightenment
1412

1513
class AboutParrots:
1614
pass
@@ -32,7 +30,7 @@ class AboutFreemasons:
3230
pass
3331

3432
error_assertion_with_message = """Traceback (most recent call last):
35-
File "/Users/Greg/hg/python_koans/koans/about_exploding_trousers.py ", line 43, in test_durability
33+
File "/Users/Greg/hg/python_koans/koans/about_exploding_trousers.py", line 43, in test_durability
3634
self.assertEqual("Steel","Lard", "Another fine mess you've got me into Stanley...")
3735
AssertionError: Another fine mess you've got me into Stanley..."""
3836

@@ -85,23 +83,19 @@ class AboutFreemasons:
8583
class TestSensei(unittest.TestCase):
8684

8785
def setUp(self):
88-
self.sensei = Sensei(WritelnDecorator(sys.stdout))
89-
self.sensei.stream.writeln = Mock()
90-
path_to_enlightenment.koans = Mock()
91-
self.tests = Mock()
92-
self.tests.countTestCases = Mock()
86+
self.sensei = Sensei(WritelnDecorator(Mock()))
9387

9488
def test_that_it_successes_only_count_if_passes_are_currently_allowed(self):
95-
self.sensei.passesCount = Mock()
96-
MockableTestResult.addSuccess = Mock()
97-
self.sensei.addSuccess(Mock())
98-
self.assertTrue(self.sensei.passesCount.called)
89+
with patch('runner.mockable_test_result.MockableTestResult.addSuccess', Mock()):
90+
self.sensei.passesCount = Mock()
91+
self.sensei.addSuccess(Mock())
92+
self.assertTrue(self.sensei.passesCount.called)
9993

10094
def test_that_it_increases_the_passes_on_every_success(self):
101-
pass_count = self.sensei.pass_count
102-
MockableTestResult.addSuccess = Mock()
103-
self.sensei.addSuccess(Mock())
104-
self.assertEqual(pass_count + 1, self.sensei.pass_count)
95+
with patch('runner.mockable_test_result.MockableTestResult.addSuccess', Mock()):
96+
pass_count = self.sensei.pass_count
97+
self.sensei.addSuccess(Mock())
98+
self.assertEqual(pass_count + 1, self.sensei.pass_count)
10599

106100
def test_that_nothing_is_returned_as_sorted_result_if_there_are_no_failures(self):
107101
self.sensei.failures = []
@@ -216,58 +210,50 @@ def test_that_if_there_are_0_successes_it_will_say_the_first_zen_of_python_koans
216210
self.sensei.pass_count = 0
217211
self.sensei.failures = Mock()
218212
words = self.sensei.say_something_zenlike()
219-
220213
m = re.search("Beautiful is better than ugly", words)
221214
self.assertTrue(m and m.group(0))
222215

223216
def test_that_if_there_is_1_successes_it_will_say_the_second_zen_of_python_koans(self):
224217
self.sensei.pass_count = 1
225218
self.sensei.failures = Mock()
226219
words = self.sensei.say_something_zenlike()
227-
228220
m = re.search("Explicit is better than implicit", words)
229221
self.assertTrue(m and m.group(0))
230222

231223
def test_that_if_there_is_10_successes_it_will_say_the_sixth_zen_of_python_koans(self):
232224
self.sensei.pass_count = 10
233225
self.sensei.failures = Mock()
234226
words = self.sensei.say_something_zenlike()
235-
236227
m = re.search("Sparse is better than dense", words)
237228
self.assertTrue(m and m.group(0))
238229

239230
def test_that_if_there_is_36_successes_it_will_say_the_final_zen_of_python_koans(self):
240231
self.sensei.pass_count = 36
241232
self.sensei.failures = Mock()
242233
words = self.sensei.say_something_zenlike()
243-
244234
m = re.search("Namespaces are one honking great idea", words)
245235
self.assertTrue(m and m.group(0))
246236

247237
def test_that_if_there_is_37_successes_it_will_say_the_first_zen_of_python_koans_again(self):
248238
self.sensei.pass_count = 37
249239
self.sensei.failures = Mock()
250240
words = self.sensei.say_something_zenlike()
251-
252241
m = re.search("Beautiful is better than ugly", words)
253242
self.assertTrue(m and m.group(0))
254243

255244
def test_that_total_lessons_return_7_if_there_are_7_lessons(self):
256245
self.sensei.filter_all_lessons = Mock()
257246
self.sensei.filter_all_lessons.return_value = [1,2,3,4,5,6,7]
258-
259247
self.assertEqual(7, self.sensei.total_lessons())
260248

261249
def test_that_total_lessons_return_0_if_all_lessons_is_none(self):
262250
self.sensei.filter_all_lessons = Mock()
263251
self.sensei.filter_all_lessons.return_value = None
264-
265252
self.assertEqual(0, self.sensei.total_lessons())
266253

267254
def test_total_koans_return_43_if_there_are_43_test_cases(self):
268255
self.sensei.tests.countTestCases = Mock()
269256
self.sensei.tests.countTestCases.return_value = 43
270-
271257
self.assertEqual(43, self.sensei.total_koans())
272258

273259
def test_filter_all_lessons_will_discover_test_classes_if_none_have_been_discovered_yet(self):

0 commit comments

Comments
 (0)