Câu trả lời ngắn gọn là không". Phần thú vị hơn là tại sao / làm thế nào tình huống này có thể phát sinh.
Tôi nghĩ rằng sự nhầm lẫn đang phát sinh do bạn đang cố gắng tuân thủ các thực hành kiểm tra nghiêm ngặt (kiểm tra đơn vị so với kiểm tra tích hợp, chế nhạo, v.v.) đối với mã dường như không tuân thủ các thực tiễn nghiêm ngặt.
Điều đó không có nghĩa là mã là "sai", hoặc các thực tiễn cụ thể đó tốt hơn các quy tắc khác. Đơn giản là một số giả định được thực hiện bởi các thực tiễn thử nghiệm có thể không áp dụng trong tình huống này và nó có thể giúp sử dụng một mức độ "nghiêm ngặt" tương tự trong thực tiễn mã hóa và thực hành thử nghiệm; hoặc ít nhất, để thừa nhận rằng chúng có thể bị mất cân bằng, điều này sẽ khiến một số khía cạnh không thể áp dụng hoặc dư thừa.
Lý do rõ ràng nhất là chức năng của bạn đang thực hiện hai nhiệm vụ khác nhau:
- Nhìn lên
Person
dựa trên tên của họ. Điều này đòi hỏi phải thử nghiệm tích hợp, để đảm bảo nó có thể tìm thấy Person
các đối tượng có lẽ được tạo / lưu trữ ở nơi khác.
- Tính xem a
Person
có đủ tuổi hay không, dựa trên giới tính của họ. Điều này đòi hỏi thử nghiệm đơn vị, để đảm bảo tính toán thực hiện như mong đợi.
Bằng cách nhóm các tác vụ này lại với nhau thành một khối mã, bạn không thể chạy cái này mà không có cái kia. Khi bạn muốn kiểm tra các phép tính, bạn buộc phải tìm kiếm một Person
(từ cơ sở dữ liệu thực hoặc từ sơ khai / giả). Khi bạn muốn kiểm tra xem tra cứu có tích hợp với phần còn lại của hệ thống không, bạn cũng buộc phải thực hiện phép tính theo tuổi. Chúng ta nên làm gì với tính toán đó? Chúng ta nên bỏ qua nó, hoặc kiểm tra nó? Đó dường như là tình huống chính xác mà bạn mô tả trong câu hỏi của mình.
Nếu chúng ta tưởng tượng một sự thay thế, chúng ta có thể tự mình tính toán:
def is_old_enough?(person)
if person.male?
return person.age > 21
else
return person.age > 18
end
end
Vì đây là một phép tính thuần túy, chúng tôi không cần thực hiện các thử nghiệm tích hợp trên nó.
Chúng tôi cũng có thể bị cám dỗ để viết riêng nhiệm vụ tra cứu:
def person_from_name(name = 'filip')
return Person::API.new(name)
end
Tuy nhiên, trong trường hợp này, chức năng rất gần với Person::API.new
điều đó tôi muốn nói rằng bạn nên sử dụng nó thay vào đó (nếu tên mặc định là cần thiết, liệu nó có được lưu trữ tốt hơn ở nơi khác, như thuộc tính lớp không?).
Khi viết các bài kiểm tra tích hợp cho Person::API.new
(hoặc person_from_name
) tất cả những gì bạn cần quan tâm là liệu bạn có nhận lại được mong đợi hay không Person
; tất cả các tính toán dựa trên tuổi được quan tâm ở nơi khác, vì vậy các bài kiểm tra tích hợp của bạn có thể bỏ qua chúng.