การทำซ้ำข้อมูลระหว่างการทดสอบและรหัสจริงดีหรือไม่ดี ตัวอย่างเช่นสมมติว่าฉันมีคลาส Python FooSaver
ที่บันทึกไฟล์ด้วยชื่อเฉพาะลงในไดเรกทอรีที่กำหนด:
class FooSaver(object):
def __init__(self, out_dir):
self.out_dir = out_dir
def _save_foo_named(self, type_, name):
to_save = None
if type_ == FOOTYPE_A:
to_save = make_footype_a()
elif type == FOOTYPE_B:
to_save = make_footype_b()
# etc, repeated
with open(self.out_dir + name, "w") as f:
f.write(str(to_save))
def save_type_a(self):
self._save_foo_named(a, "a.foo_file")
def save_type_b(self):
self._save_foo_named(b, "b.foo_file")
ตอนนี้ในการทดสอบของฉันฉันต้องการให้แน่ใจว่าไฟล์เหล่านี้ทั้งหมดถูกสร้างขึ้นดังนั้นฉันต้องการพูดแบบนี้:
foo = FooSaver("/tmp/special_name")
foo.save_type_a()
foo.save_type_b()
self.assertTrue(os.path.isfile("/tmp/special_name/a.foo_file"))
self.assertTrue(os.path.isfile("/tmp/special_name/b.foo_file"))
แม้ว่าสิ่งนี้จะซ้ำกับชื่อไฟล์ในสองแห่ง แต่ฉันคิดว่ามันดี: มันบังคับให้ฉันเขียนสิ่งที่ฉันคาดหวังว่าจะออกมาจากปลายอีกด้านหนึ่งมันเพิ่มชั้นของการป้องกันการพิมพ์ผิดและโดยทั่วไปทำให้ฉันรู้สึกมั่นใจว่าสิ่งต่างๆ อย่างที่ฉันคาดไว้ ฉันรู้ว่าถ้าฉันเปลี่ยนa.foo_file
ไปtype_a.foo_file
ในอนาคตฉันจะต้องทำการค้นหาและแทนที่ในการทดสอบของฉัน แต่ฉันไม่คิดว่ามันเป็นเรื่องใหญ่เกินไป ฉันควรจะมีผลบวกที่ผิดพลาดหากฉันลืมอัปเดตการทดสอบเพื่อแลกเปลี่ยนเพื่อให้แน่ใจว่าการเข้าใจรหัสและการทดสอบของฉันตรงกัน
เพื่อนร่วมงานคิดว่าการทำซ้ำนี้ไม่ดีและแนะนำให้ฉันปรับโครงสร้างทั้งสองด้านเป็นดังนี้:
class FooSaver(object):
A_FILENAME = "a.foo_file"
B_FILENAME = "b.foo_file"
# as before...
def save_type_a(self):
self._save_foo_named(a, self.A_FILENAME)
def save_type_b(self):
self._save_foo_named(b, self.B_FILENAME)
และในการทดสอบ:
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.A_FILENAME))
self.assertTrue(os.path.isfile("/tmp/special_name/" + FooSaver.B_FILENAME))
ฉันไม่ชอบสิ่งนี้เพราะมันไม่ทำให้ฉันมั่นใจว่ารหัสกำลังทำสิ่งที่ฉันคาดไว้ --- ฉันเพิ่งทำซ้ำout_dir + name
ขั้นตอนทั้งด้านการผลิตและด้านการทดสอบ มันจะไม่เปิดเผยข้อผิดพลาดในความเข้าใจของฉันเกี่ยวกับวิธีการ+
ทำงานของสายอักขระและจะไม่ตรวจจับความผิดพลาด
ในทางตรงกันข้ามมันเปราะน้อยกว่าการเขียนสตริงเหล่านั้นสองครั้งและดูเหมือนว่าฉันผิดเล็กน้อยที่จะทำซ้ำข้อมูลในไฟล์สองไฟล์เช่นนั้น
มีแบบอย่างที่ชัดเจนที่นี่? การทำซ้ำค่าคงที่ตลอดการทดสอบและรหัสการผลิตหรือไม่หรือว่าเปราะเกินไป?