Kiểm thử đơn vị: Đây là mùi mã nếu bạn đang tái cấu trúc và không có cộng tác viên nào?


9

Tôi đang đọc Nghệ thuật kiểm tra đơn vị của Roy Osherove. Tôi đang ở phần 7.2 Viết các bài kiểm tra có thể duy trì trong đó tác giả có lưu ý này về mùi mã:

LƯU Ý: Khi bạn cấu trúc lại trạng thái bên trong để hiển thị với thử nghiệm bên ngoài, nó có thể được coi là mùi mã không (dấu hiệu cho thấy có gì đó không đúng trong thiết kế hoặc logic của mã)? Đây không phải là mùi mã khi bạn tái cấu trúc để tiếp xúc với cộng tác viên. Đó là mùi mã nếu bạn tái cấu trúc và không có cộng tác viên (vì vậy bạn không cần phải sơ khai hoặc chế nhạo bất cứ điều gì).

EDIT : Những gì tác giả có nghĩa là "cộng tác viên" là phụ thuộc. Một số ví dụ của anh ta cho các phụ thuộc là các lớp truy cập cơ sở dữ liệu hoặc truy cập hệ thống tệp của HĐH. Đây là nơi anh ta xác định sơ khai và bắt đầu sử dụng từ cộng tác viên:

Một sơ khai là một sự thay thế điều khiển cho một tập phụ thuộc (hoặc cộng tác viên ) trong hệ thống.

Tác giả không có ví dụ về mùi mã này và tôi gặp khó khăn trong việc hiểu / hình dung ra nó sẽ trông như thế nào. Ai đó có thể giải thích điều này nhiều hơn một chút và có thể cung cấp một ví dụ cụ thể?


Tôi nghĩ rằng sự nhầm lẫn ở đây bắt nguồn từ từ "Cộng tác viên". Tôi phải thừa nhận tôi cũng không chắc anh ta có ý gì trong bối cảnh này.
rossipedia

@Bryan Ross, tôi đã cập nhật bài đăng với cách tác giả sử dụng từ "cộng tác viên". Cảm ơn!
lập trình viên

Câu trả lời:


3

Tôi nghĩ rằng đây là những gì tác giả đang nhận được.

Trong mẫu mã của tôi, tôi có một cửa sổ thời gian lấy số lượng đầu ra cộng với thời gian bắt đầu và dừng. Mục đích là để vẽ một cửa sổ đầu ra trong khoảng thời gian 24 giờ. Một nếp nhăn được thêm vào khi thời gian bắt đầu lớn hơn thời gian dừng vì đó là cửa sổ thời gian kéo dài đến nửa đêm.

Bạn có thể viết các bài kiểm tra đơn vị thực hiện đầy đủ đối tượng mà không để lộ các biến riêng tư. Những trò chơi và thời gian riêng tư đó là những cộng tác viên mà anh ấy đề cập đến khi đưa ra nội bộ để thử nghiệm đơn vị. Theo cuốn sách, việc phơi bày những nội bộ đó sẽ KHÔNG phải là mùi mã vì họ là cộng tác viên.

Phơi bày gấp đôi outputsẽ là một mùi mã vì nó không phải là cộng tác viên - đó là một yếu tố được ẩn giấu rõ ràng bởi chính lớp có logic điều kiện bên trong GetOutputđể xác định cái gì sẽ được trả về.

Việc đào sâu vào các bools / timespans sẽ giúp các bài kiểm tra đơn vị toàn diện hơn. Ông nói điều này là tốt.
Đi sâu vào gấp đôi outputsẽ yêu cầu logic bổ sung trong bài kiểm tra đơn vị của bạn phản chiếu những gì GetOutputđang làm. Đây sẽ là mùi mã anh ấy đề cập đến.

lớp công cộng TimeWindow
{
  bool riêng làConst;
  bool riêng kéo dài nửa đêm;
  Thời gian riêng tư Bắt đầu1;
  Thời gian riêng tư Dừng 1;
  Thời gian riêng tư Bắt đầu2;
  Thời gian riêng tư Dừng 2;
  sản lượng kép riêng;

  công khai TimeWindow (nhân đôi, bắt đầu TimeSpan, dừng TimeSpan)
  {
    đầu ra = ra;

    nếu (bắt đầu == dừng)
      isConst = true;
    khác nếu (bắt đầu> dừng)
    {
      spansUnnight = true;
      bắt đầu1 = nửa đêm;
      dừng1 = dừng lại;
      start2 = bắt đầu;
      dừng2 = nửa đêm;
    }
    khác 
    {
      start1 = bắt đầu;
      dừng1 = dừng lại;
    }
  }

  công khai gấp đôi GetOutput (TimeSpan time)
  {
    // một số logic ở đây về những gì / làm thế nào để trở về
    ...
    đầu ra trở lại;
  }

}

0

Giả sử chúng ta có một lớp miền và lớp miền này có kiến ​​thức trực tiếp về lớp kiên trì bằng cách sử dụng Kho lưu trữ, nó sử dụng để hiển thị phương thức "Lưu" ở mức cá thể mà các đối tượng làm việc trên lớp miền có thể gọi để thay đổi liên tục được thực hiện mà không cần kiến ​​thức về cơ chế (cho dù đây là thiết kế "tốt" là một cuộc thảo luận cho một ngày khác). Tái cấu trúc lớp để hiển thị Kho lưu trữ này như là một đối số thuộc tính và / hoặc hàm tạo, do đó cho phép một Kho lưu trữ giả được thông qua có thể đảm bảo thực hiện cuộc gọi phù hợp, thường là một điều tốt không chỉ để kiểm tra mà còn duy trì chung.

Bây giờ, đây là một lớp miền, nó có dữ liệu trạng thái. Chúng ta hãy giả sử rằng một trong các thuộc tính trạng thái có trường sao lưu và người truy cập thuộc tính kiểm tra rằng đầu vào mới có giá trị dựa trên giá trị hiện tại (có thể giá trị mới không bao giờ có thể nhỏ hơn giá trị cũ). Bạn cần kiểm tra xác thực này, nhưng bạn thấy rằng làm như vậy đòi hỏi quyền truy cập vào trường sao lưu để đặt giá trị ban đầu mà sau đó bạn sẽ cố gắng ghi đè. Đây phải là một lá cờ đỏ; nếu thử nghiệm cần truy cập vào các lĩnh vực sao lưu (mà là một chi tiết thực hiện; không có người tiêu dùng nên bao giờ hếtphải biết nó ở đó) để đưa đối tượng vào trạng thái nhất quán cho một thử nghiệm, vậy làm thế nào mã sản xuất có được một đối tượng nhất quán? Nếu có một phương thức để mã sản xuất thực hiện giống như thử nghiệm của bạn, thì thử nghiệm đó có thể bắt chước theo cách đó. Nếu không có cách hợp lệ để mã sản xuất đưa đối tượng vào trạng thái này, thì tại sao bạn lại thử nghiệm kịch bản này?

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.