Trong nhóm các nhà phát triển JavaScript của chúng tôi, chúng tôi đã chấp nhận phong cách redux/phản ứng của việc viết mã chức năng thuần túy. Tuy nhiên, dường như chúng tôi gặp sự cố khi kiểm tra mã của chúng tôi. Hãy xem xét ví dụ sau:Làm thế nào để kiểm tra một cây gọi hàm thuần túy trong sự cô lập?
function foo(data) {
return process({
value: extractBar(data.prop1),
otherValue: extractBaz(data.prop2.someOtherProp)
});
}
Chức năng này gọi phụ thuộc vào các cuộc gọi đến process
, extractBar
và extractBaz
, mỗi trong số đó có thể gọi các chức năng khác. Cùng nhau, họ có thể yêu cầu một mô hình không tầm thường để tham số data
được xây dựng để thử nghiệm.
Nếu chúng ta chấp nhận sự cần thiết của việc tạo ra một đối tượng giả như vậy và thực sự làm như vậy trong các thử nghiệm, chúng tôi nhanh chóng tìm thấy chúng tôi có các trường hợp kiểm tra khó đọc và duy trì. Hơn nữa, nó rất có thể dẫn đến kiểm tra cùng một điều hơn và hơn, như các bài kiểm tra đơn vị cho process
, extractBar
và extractBaz
có lẽ cũng nên được viết. Thử nghiệm cho từng trường hợp cạnh có thể được thực hiện bởi các chức năng này thông qua giao diện foo
khó sử dụng.
Chúng tôi có một vài giải pháp trong đầu, nhưng không thực sự thích bất kỳ giải pháp nào, vì dường như chúng tôi chưa từng thấy.
Giải pháp 1:
function foo(data, deps = defaultDeps) {
return deps.process({
value: deps.extractBar(data.prop1),
otherValue: deps.extractBaz(data.prop2.someOtherProp)
});
}
Giải pháp 2:
function foo(
data,
processImpl = process,
extractBarImpl = extractBar,
extractBazImpl = extractBaz
) {
return process({
value: extractBar(data.prop1),
otherValue: extractBaz(data.prop2.someOtherProp)
});
}
Giải pháp 2 ô nhiễm foo
phương pháp chữ ký rất nhanh chóng khi số lượng chức năng phụ thuộc gọi tăng.
Giải pháp 3:
Chỉ cần chấp nhận sự thật rằng foo
là một hoạt động hợp chất phức tạp và thử nghiệm nó như một toàn thể. Tất cả những hạn chế áp dụng.
Vui lòng đề xuất các khả năng khác. Tôi tưởng tượng đây là vấn đề mà cộng đồng lập trình chức năng phải giải quyết theo cách này hay cách khác.