Skip to content

Commit 64a5eac

Browse files
committed
refactor(chapter12): streamline Employee class by removing type validation and enhancing type handling
1 parent f51e94a commit 64a5eac

File tree

2 files changed

+44
-40
lines changed

2 files changed

+44
-40
lines changed

chapter12/src/case06/case06_2.py

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,38 @@
11
class Employee:
22
def __init__(self, name, type):
3-
self.validate_type(type)
43
self._name = name
5-
self._type = type
6-
7-
def validate_type(self, arg):
8-
if arg not in ["engineer", "manager", "salesman"]:
9-
raise ValueError(f"Employee cannot be of type {arg}")
10-
11-
@property
12-
def type_string(self):
13-
return str(self._type)
14-
4+
self._type = self.create_employee_type(type)
5+
156
@property
167
def type(self):
178
return self._type
18-
9+
1910
@type.setter
2011
def type(self, arg):
21-
self._type = Employee.create_employee_type(arg)
22-
12+
self._type = self.create_employee_type(arg)
13+
2314
@property
2415
def capitalized_type(self):
25-
return self.type_string.capitalize()
26-
27-
@classmethod
28-
def create_employee_type(cls, employee_type):
29-
if employee_type == "engineer":
16+
return str(self._type).capitalize()
17+
18+
@staticmethod
19+
def create_employee_type(type_code):
20+
if type_code == "engineer":
3021
return Engineer()
31-
elif employee_type == "manager":
22+
elif type_code == "manager":
3223
return Manager()
33-
elif employee_type == "salesperson":
34-
return Salesperson()
24+
elif type_code == "salesman":
25+
return Salesman()
3526
else:
36-
raise NotImplementedError(f"Employee cannot be of type {employee_type}")
37-
27+
raise ValueError(f"Employee cannot be of type {type_code}")
28+
3829
def __str__(self):
3930
return f"{self._name} ({self.capitalized_type})"
4031

4132

4233
class EmployeeType:
43-
def __init__(self, value):
44-
self._value = value
45-
4634
def __str__(self):
47-
return self._value
35+
raise NotImplementedError("Subclasses must implement __str__ method")
4836

4937

5038
class Engineer(EmployeeType):
@@ -57,6 +45,6 @@ def __str__(self):
5745
return "manager"
5846

5947

60-
class Salesperson(EmployeeType):
48+
class Salesman(EmployeeType):
6149
def __str__(self):
62-
return "salesperson"
50+
return "salesman"

chapter12/tests/case06/test_case06_2.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
import pytest
22

3-
from chapter12.src.case06.case06_2 import Employee
3+
from chapter12.src.case06.case06_2 import (
4+
Employee,
5+
Engineer,
6+
Manager,
7+
Salesman,
8+
)
49

510

611
def test_employee_creation_with_valid_types():
712
"""유효한 타입으로 직원을 생성할 수 있는지 테스트"""
813
valid_types = ["engineer", "manager", "salesman"]
14+
expected_classes = [Engineer, Manager, Salesman]
915

10-
for type_value in valid_types:
16+
for i, type_value in enumerate(valid_types):
1117
employee = Employee("Test Employee", type_value)
1218
assert employee._name == "Test Employee"
13-
assert employee._type == type_value
14-
assert employee.type == type_value # getter 테스트
19+
assert isinstance(employee._type, expected_classes[i])
1520

1621

1722
def test_employee_creation_with_invalid_type():
@@ -25,15 +30,15 @@ def test_employee_creation_with_invalid_type():
2530
def test_employee_type_setter():
2631
"""type 속성의 setter가 올바르게 작동하는지 테스트"""
2732
employee = Employee("John Doe", "engineer")
28-
assert employee.type == "engineer"
33+
assert isinstance(employee.type, Engineer)
2934

3035
employee.type = "manager"
31-
assert employee.type == "manager"
32-
assert employee._type == "manager"
36+
assert isinstance(employee.type, Manager)
3337

34-
# 주의: setter는 타입 검증을 하지 않음
35-
employee.type = "developer"
36-
assert employee.type == "developer"
38+
# 유효하지 않은 타입으로 설정 시도
39+
with pytest.raises(ValueError) as excinfo:
40+
employee.type = "developer"
41+
assert "Employee cannot be of type developer" in str(excinfo.value)
3742

3843

3944
def test_employee_capitalized_type():
@@ -58,3 +63,14 @@ def test_employee_string_representation():
5863

5964
employee = Employee("Bob Johnson", "salesman")
6065
assert str(employee) == "Bob Johnson (Salesman)"
66+
67+
68+
def test_employee_type_classes():
69+
"""EmployeeType 서브클래스들이 올바르게 작동하는지 테스트"""
70+
engineer = Engineer()
71+
manager = Manager()
72+
salesman = Salesman()
73+
74+
assert str(engineer) == "engineer"
75+
assert str(manager) == "manager"
76+
assert str(salesman) == "salesman"

0 commit comments

Comments
 (0)