5

Giả sử bạn đang viết một hàm để kiểm tra xem trang có đạt được URL thích hợp hay không. Trang này có một lệnh "chuẩn" - ví dụ, trong khi một trang có thể đạt được tại stackoverflow.com/questions/123, chúng tôi muốn (vì lý do SEO) để chuyển hướng nó tới stackoverflow.com/questions/123/how-do -i-move-the-turtle-in-logo - và chuyển hướng thực được an toàn chứa trong phương thức riêng của nó (ví dụ: redirectPage ($ url)), nhưng làm thế nào để bạn kiểm tra đúng chức năng gọi nó?Chức năng kiểm tra đơn vị có tác dụng phụ?

Ví dụ, mất chức năng sau:

function checkStub($questionId, $baseUrl, $stub) { 
    canonicalStub = model->getStub($questionId); 
    if ($stub != $canonicalStub) { 
    redirectPage($baseUrl . $canonicalStub); 
    } 
} 

Nếu bạn đã kiểm tra đơn vị sự checkStub() chức năng, sẽ không chuyển hướng được theo cách này?

Đây là một phần của vấn đề lớn hơn trong đó một số chức năng dường như quá lớn và rời khỏi lĩnh vực thử nghiệm đơn vị và vào thế giới thử nghiệm tích hợp. Tâm trí của tôi ngay lập tức nghĩ về các bộ định tuyến và bộ điều khiển vì có những loại vấn đề này, vì việc kiểm tra chúng nhất thiết dẫn đến việc tạo ra các trang thay vì chỉ giới hạn trong chức năng riêng của chúng.

Tôi có bị lỗi khi thử nghiệm đơn vị không?

+0

chậm lại ... và suy nghĩ lại những gì được bạn thực sự cố gắng thử nghiệm ở đây ... Nếu bạn loại bỏ các Redirect, các checkStub phương pháp không làm nhiều nên tôi không chắc về bài kiểm tra thực sự ở đây. Thông thường bạn kiểm tra các tác dụng phụ mà một chức năng như vậy gây ra. – Gishu

+0

@gishu: vâng, đó là một ví dụ vô cùng sai lầm sinh ra từ một vấn đề trước đó tôi đã sắp xếp ra .. vấn đề đã được cố định, nhưng ví dụ (chuyển hướng) đã bị mắc kẹt trong đầu của tôi.Tập trung vào phần cuối của câu hỏi - bộ định tuyến, bộ điều khiển - như là thịt thực sự của câu hỏi. Làm cách nào để kiểm tra các hàm có tiêu điểm phần lớn là "tạo ra mọi thứ" nhưng vẫn cần được kiểm tra do thứ tự và logic nội bộ của chúng. Tôi sẽ đi ra ngoài bây giờ và tôi sẽ có khả năng chỉnh sửa địa ngục trong câu hỏi này vào buổi sáng. Hy vọng rằng bạn có thể thấy ý định của tôi bây giờ (nó có thể giúp để biết tôi là thương hiệu mới để thử nghiệm đơn vị). – AgentConundrum

+0

Bạn khá nhiều chỉ nói rằng bạn đang trộn logic với tạo đối tượng, mà làm cho đơn vị thử nghiệm khó khăn. Bạn có thể chia hai mối quan tâm này không? Nếu vậy, viết các bài kiểm tra đơn vị của bạn sẽ khá tầm thường. – strager

Trả lời

0

Có vẻ như bạn chỉ có một trường hợp thử nghiệm khác. Bạn cần phải kiểm tra xem cuống có được xác định chính xác như là một cuống có cả thử nghiệm dương và âm, và bạn cần phải kiểm tra xem trang mà bạn được chuyển hướng có chính xác hay không.

Hoặc tôi hoàn toàn hiểu nhầm câu hỏi?

+2

bạn có thể nói dối câu hỏi ur và sửa lỗi chính tả kthx không? – strager

1

Bạn nói ...

Đây là một phần của một vấn đề lớn mà chức năng nào đó dường như trở nên quá lớn và rời khỏi lĩnh vực kiểm tra đơn vị và bước vào thế giới của thử nghiệm tích hợp

Tôi nghĩ rằng đây là lý do tại sao thử nghiệm đơn vị là (1) cứng và (2) dẫn đến mã mà không sụp đổ dưới trọng lượng riêng của mình. Bạn phải tỉ mỉ về việc phá vỡ tất cả các phụ thuộc của bạn hoặc bạn kết thúc với bài kiểm tra đơn vị == kiểm thử tích hợp.

Trong ví dụ của bạn, bạn sẽ tiêm trình chuyển hướng dưới dạng phụ thuộc. Bạn sử dụng một mô hình, nhân đôi hoặc gián điệp. Sau đó, bạn làm các bài kiểm tra như @atk đẻ ra. Đôi khi nó không có giá trị nó. Thường xuyên hơn nó buộc bạn phải viết mã tốt hơn. Và thật khó để làm mà không có một thùng chứa IOC.

1

Đây là câu hỏi cũ, nhưng tôi nghĩ câu trả lời này có liên quan. @Rob nói rằng bạn sẽ tiêm một redirector như là một phụ thuộc - và chắc chắn, điều này hoạt động. Tuy nhiên, vấn đề của bạn là bạn không có một mối quan tâm tốt.

Bạn cần phải thực hiện các chức năng của mình dưới dạng nguyên tử nhất có thể và sau đó soạn chức năng lớn hơn bằng cách sử dụng các hàm chi tiết mà bạn đã tạo. Bạn viết này:

function checkStub($questionId, $baseUrl, $stub) { 
    canonicalStub = model->getStub($questionId); 
    if ($stub != $canonicalStub) { 
    redirectPage($baseUrl . $canonicalStub); 
    } 
} 

Tôi muốn viết những dòng này:

function checkStubEquality($stub1, $stub2) { 
    return $stub1 == $stub2; 
    } 

    canonicalStub = model->getStub($questionId); 
    if (!checkStubEquality(canonicalStub, $stub)) redirectPage($baseUrl . $canonicalStub); 
Các vấn đề liên quan