2015-02-04 21 views
7

Bất cứ ai có thể cho tôi biết rõ ràng sự khác biệt chính giữa số shimstub khi kiểm tra đơn vị là gì?Sự khác biệt giữa shims và stubs

Tôi biết về các đối tượng giả và giả và tôi đã đọc về shims và sơ khai nhưng vẫn không rõ ràng trong bối cảnh nào tôi nên sử dụng shim hoặc sơ khai.

Trả lời

7

Hãy để tôi trích dẫn bài viết của Martin Fowler Mocks Aren't Stubs:

Ống cung cấp câu trả lời đóng hộp cho các cuộc gọi được thực hiện trong kiểm tra, thường không đáp ứng ở tất cả để bất cứ điều gì ngoài những gì được lập trình trong cho kỳ thi này . Sơ khai cũng có thể ghi lại thông tin về các cuộc gọi, chẳng hạn như một email mục nhập cổng để nhớ thư được gửi '' hoặc có thể chỉ cách một số thư được gửi ' '.

Mocks được [...] đối tượng lập trình trước với kỳ vọng mà tạo thành một đặc điểm kỹ thuật của các cuộc gọi mà họ dự kiến ​​sẽ nhận được.

Vì vậy, người quản lý có thể trực tiếp thực hiện kiểm tra không thành công nếu kỳ vọng bị vi phạm. Sơ khai không làm điều đó.

Miếng chêm (hoặc nốt ruồi) khác với cả hai chúng ở chỗ chúng có thể được sử dụng để thay thế các phụ thuộc được mã hóa cứng như phương pháp tĩnh. Bạn nên tránh IMO đó và muốn tái cấu trúc lại, điều này làm cho các phụ thuộc này có thể thay thế được. Xem this thread để thảo luận thêm, đặc biệt là câu trả lời của Jim Cooper.

+1

tôi khuyên bạn nên để có được một số kinh nghiệm dưới của bạn vành đai trước khi lo lắng về các chi tiết làm việc với kiểm tra doubl es. Chúc may mắn! – EagleBeak

1

Là hướng dẫn chung, hãy sử dụng stubs cho các cuộc gọi trong giải pháp Visual Studio của bạn và shims cho các cuộc gọi đến các hội đồng được tham chiếu khác. Điều này là bởi vì trong giải pháp của riêng bạn, thực hành tốt là tách rời các thành phần bằng cách định nghĩa các giao diện theo cách mà đòi hỏi phải có yêu cầu. Nhưng các assembly bên ngoài như System.dll thường không được cung cấp với các định nghĩa giao diện riêng biệt, vì vậy bạn phải sử dụng shims để thay thế.

enter image description here

Nó rất tốt reference.

2

Từ những gì tôi hiểu, sự khác biệt là nơi mã giả mạo cư trú hoặc phần mã nào bạn đã chế nhạo (tức là "nơi" cung cấp sự phân biệt). Vì vậy, tôi sẽ đặt nó như:

Bạn gọi Stub một phần của mã của bạn mà bạn chế giễu trong khi nó sẽ được gọi là Shim nếu bạn thử một số cuộc gọi từ bên ngoài.

  • "mã của bạn" được mã để được kiểm tra
  • "cuộc gọi từ bên ngoài" là sự phụ thuộc vào đó mã của bạn phụ thuộc

tôi tìm thấy tài liệu tham khảo này tốt: My two cents on fakes, stubs, mocks, and shims đặc biệt là phần "Nguyên tắc chung là tận dụng lợi thế của các cuống cho các cuộc gọi nội bộ và các miếng chêm cho các cụm bên ngoài."

0

Miếng chêm là thường được sử dụng để cung cấp mocks từ các assembly bên ngoài giải pháp của bạn, trong khi stubs được sử dụng để tạo ra các mocks của các lớp trong giải pháp của bạn.

Ví dụ về Sơ khai

// Create the fake calculator: 
ICalculator calculator = new Calculator.Fakes.StubICalculator() 
{ 
// Define each method: 
Add = (a,b) => { return 25; } 
}; 

Ví dụ về miếng chêm

//Using shims to control the response to DateTime.Now 
using (ShimsContext.Create()) 
{ 
// insert the delegate that returns call for DateTime.Now 
System.Fakes.ShimDateTime.NowGet =() => new DateTime(2010, 1, 1); 
MethodThatUsesDateTimeNow(); 
} 

Courtesy: thi Ref 70-486

Các vấn đề liên quan