2009-12-18 33 views
8

Hiện tại tôi đang đọc một cuốn sách (Pro ASP.Net Framework).Tại sao lại sử dụng khung mocking thay vì xoay vòng tay của chúng tôi?

Trong cuốn sách này, tác giả đề nghị sử dụng một số Moq framework để trợ giúp thực hiện TDD.

[Test] 
public void List_Presents_Correct_Page_Of_Products() 
{ 
    IProductsRepository repository = MockProductsRepository(
     new Product { Name = "P1" }, new Product { Name = "P2" }, 
     new Product { Name = "P3" }, new Product { Name = "P4" }, 
     new Product { Name = "P5" } 
    ); 

    ProductsController controller = new ProductsController(repository); 
    ... 
} 


static IProductsRepository MockProductsRepository(params Product[] prods) 
{ 
    // Generate an implementor of IProductsRepository at runtime using Moq 
    var mockProductsRepos = new Moq.Mock<IProductsRepository>(); 
    mockProductsRepos.Setup(x => x.Products).Returns(prods.AsQueryable()); 
    return mockProductsRepos.Object; 
} 

Trong lớp mô hình, chúng tôi đã xác định FakeRepository và SqlRepository.

Thực tế là tôi không thấy lợi thế của việc sử dụng khung công tác moq này. Tại sao chúng ta không chỉ sử dụng FakeRepository của chúng ta? Hoặc xóa FakeRepository của chúng tôi và thêm sản phẩm giả mạo vào nó?

Lúc đầu, tôi nghĩ rằng khung moq đã có để tạo dữ liệu giả mạo, do đó bạn không phải làm như vậy nếu bạn có ví dụ 100 đối tượng giả để tạo.

Những gì tôi bỏ lỡ?

Trả lời

12

Một số ưu điểm của khuôn khổ giả trên mocks cuộn bằng tay:

  • Các hành vi giả là gần gũi hơn với các mã kiểm tra vì nó là trong mã thử nghiệm. Điều này làm cho các bài kiểm tra dễ hiểu hơn mà không cần phải nhìn vào mã khác.
  • Bạn không cần phải tạo một lớp mô hình khác (hoặc tệ hơn: thêm logic vào lớp hiện có) chỉ vì bạn muốn có hành vi hơi khác.
  • Bạn sẽ viết ít bản mẫu hơn vì bạn chỉ cần thiết lập các phương thức bạn muốn giả lập, trong khi với các phương pháp được cuộn bằng tay, bạn phải triển khai toàn bộ giao diện.

Một số nhược điểm:

  • Bạn phải học một khuôn khổ, trong khi bất cứ ai có thể viết mocks bằng tay.
  • Đó là một sự phụ thuộc khác mà bạn thêm vào dự án của mình.

(Đây là những gì tôi có thể nghĩ ngay bây giờ. Hãy để chỉnh sửa và bổ sung thêm.)

+2

Kho lưu trữ Mock cũng có thể được sử dụng để tạo ngoại lệ, thay vì tinh chỉnh kho lưu trữ giả thành tối nghĩa. –

-1

Chúng tôi sử dụng nó cho về cơ bản làm cho một máy chủ giả mạo trong một môi trường client/server.

Bằng cách đó, các cuộc gọi không phải đi tất cả các cách từ máy khách đến máy chủ đến DB và ngược lại. Họ chỉ cần truy cập vào máy chủ giả, được yêu cầu trả về một đối tượng/giá trị nhất định cho một cuộc gọi cụ thể và mong đợi một số cuộc gọi nhất định sẽ được thực hiện.

+2

Và tại sao sử dụng Moq thay vì viết một lớp FakeServer bằng tay? –

+0

Chúng tôi đã có máy chủ được viết cho một giao diện cụ thể. Mocking cơ bản điền vào các cuống cho các phương pháp chúng ta không sử dụng. Nếu chúng tôi chỉ muốn thử nghiệm một hoặc hai phương pháp, chúng tôi không phải tạo toàn bộ triển khai giao diện. –

2

Một khuôn khổ nhạo báng giúp bạn thoát khỏi gánh nặng của việc tạo ra các đối tượng giả duy nhất, trả về dữ liệu cụ thể cho trường hợp thử nghiệm của bạn. Chúng cũng cho phép kiểm tra xem có hay không một số phương thức hoặc thuộc tính nào đó đã được truy cập hoặc sửa đổi (bởi người tiêu dùng đối tượng giả). Điều này cho phép bạn dễ dàng kiểm tra hơn, và do đó thực thi, một số hành vi mong đợi nhất định.

Mock framework chỉ là công cụ. Chắc chắn bạn có thể làm điều đó bằng tay, nhưng bạn có thể thấy mình dành thời gian duy trì các lớp học chỉ để thử nghiệm.

Câu hỏi tương tự có sẵn here.

-1

Mocking này cho phép bạn kiểm soát các đầu vào đến để xác minh rằng sản lượng xảy ra một cách chính xác. Ví dụ, bạn có thể truyền dữ liệu mà bạn biết sẽ gặp lỗi, và sau đó kiểm tra xem các phương thức của bạn có thực sự ném lỗi đó không và bạn có thể truyền dữ liệu hợp lệ và kiểm tra xem dữ liệu hợp lệ có được trả về từ đối tượng hay không.

Có nhiều khung công tác hơn chỉ là Moq; có RhinoMocks và TypeMock (yêu thích cá nhân của tôi mặc dù nó có chi phí tiền trừ khi nó là một dự án mã nguồn mở) để đặt tên một vài.

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