Mỗi phương thức có nên trả về một giá trị cho Kiểm thử đơn vị không?


12

Tôi đang học cách tạo các bài kiểm tra Đơn vị đơn giản để cuối cùng (và hy vọng) bắt đầu chỉ làm TDD; bây giờ tôi đang cố gắng viết các bài kiểm tra cho mã đã được viết để xem điều gì có thể gây ra vấn đề. Đây là một trong số họ.

Giả sử tôi có lớp đơn giản này (với Bản mô tả-> Javascript):

class PrivateStuff {
    greeting: string;
    private _thisIsPrivate;

    constructor(isPrivate: boolean) {
        this._thisIsPrivate = isPrivate;
    }

    setPrivate(option) {
        this._thisIsPrivate = option;
        console.log("_thisIsPrivate changed to : " + option);
    }

    getPrivate() {
        console.log("_thisIsPrivate is : " + this._thisIsPrivate);
        return this._thisIsPrivate;        
    }
}

Và tôi sử dụng nó theo cách này:

let privateStuff = new PrivateStuff(false);

let buttonSet = document.createElement('button');
buttonSet.textContent = "Set True";
buttonSet.onclick = function () {
    privateStuff.setPrivate(true);
}

let buttonGet = document.createElement('button');
buttonGet.textContent = "Get";
buttonGet.onclick = function() {
    console.log(privateStuff.getPrivate());
}
document.body.appendChild(buttonSet);
document.body.appendChild(buttonGet);

setPrivate()không cần trả lại bất cứ điều gì, nhưng vì điều đó tôi không thể kiểm tra nó. Khi tạo một bài kiểm tra đơn vị cho nó, tôi có nên cấu trúc lại mã không?

Nếu tôi đang làm TDD, tôi có nên luôn tạo các phương thức trả về một cái gì đó chỉ để có thể kiểm tra nó không? Hay tôi đang thiếu một cái gì đó?

PS Bạn có thể xem và chạy mã ở đây


4
Nếu bạn đặtPrivate thì giá trị của getPrivate sẽ cho bạn biết nếu nó hoạt động?
JeffO

@JeffO vâng, tôi thấy bây giờ tôi không chỉ phải sử dụng hàm trả về để kiểm tra xem nó có hoạt động không.
distante

"setPrivate () không cần trả lại bất cứ thứ gì, nhưng vì điều đó tôi không thể kiểm tra nó." Liệu nó gây ra bất kỳ hiệu ứng quan sát? Nếu vậy, bạn có thể kiểm tra nó. Mặt khác, không có hứng thú trong việc thử nghiệm nó (và không có hứng thú trong việc thực hiện nó).
mgoeminne

@mgoeminne Điều gì xảy ra nếu phương thức này bị hủy và ghi vào cơ sở dữ liệu / nhật ký hoặc gửi tin nhắn đến một đối tượng khác như là hiệu ứng duy nhất của nó?
Andres F.

@AresresF. Bạn có thể đọc từ cơ sở dữ liệu / nhật ký hoặc giả định đối tượng khác để xác nhận rằng dữ liệu đã được gửi. Nó có thể không phải là một bài kiểm tra "đơn vị", nhưng đó không phải là điều thực sự quan trọng.
Jacob Raihle

Câu trả lời:


21

Tôi đoán quan niệm sai lầm của bạn ở đây là một "chủ đề đang thử nghiệm" phải luôn luôn là một phương pháp riêng. Nhưng điều đó không đúng, mặc dù một số phương thức có thể được kiểm tra mà không sử dụng bất kỳ phương thức nào khác, kích thước điển hình của SUT là một lớp hoặc một số phương thức và chức năng tương tác của một lớp. Vì vậy, nếu bạn có một phương pháp mà thay đổi trạng thái nội tại của một đối tượng, phải có luôn một số thay đổi bên ngoài có thể nhìn thấy hành vi của đối tượng đó (nếu không nó sẽ không thực hiện bất kỳ ý nghĩa để có phương pháp ở nơi đầu tiên). Và trong một bài kiểm tra đơn vị, bạn có thể xác nhận chính xác hành vi này.

Ví dụ: giả sử bạn có một lớp NumberFormattercó trách nhiệm định dạng các số dấu phẩy động theo cách được xác định trước. Hãy cho rằng nó chứa một phương thức FormatToString(double d). Chúng ta hãy giả sử rằng nó có một phương pháp setDecimalSeparator, nhưng không getDecimalSeparator. Tuy nhiên, bạn có thể dễ dàng viết một bài kiểm tra nếu sau khi một cuộc gọi đến setDecimalSeparatorphương thức FormatToStringhoạt động theo cách mong muốn. Một bài kiểm tra như vậy có thể trông như thế này

  var nf = new NumberFormatter();
  nf.setDecimalSeparator(".");
  AssertEqual("12.34",nf.FormatToString(12.34))
  nf.setDecimalSeparator(",");
  AssertEqual("12,34",nf.FormatToString(12.34))

Vì vậy, đây là một thử nghiệm có ý nghĩa setDecimalSeparator, một phương thức không có giá trị trả về.


Tôi thấy, vì vậy, trong ví dụ phi thực tế của tôi, tôi có thể sử dụng hàm get . Cảm ơn bạn đã giải thích rõ ràng của bạn!
distante
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.