2013-02-15 35 views
9

Tôi vừa mới bắt đầu đọc Professional Test Driven Development with C#: Developing Real World Applications with TDDHiểu sơ khai, giả mạo và mocks.

Tôi có một thời gian khó hiểu cuống, hàng giả và mocks. Từ những gì tôi hiểu cho đến nay, chúng là những đồ vật giả được sử dụng cho mục đích thử nghiệm đơn vị các dự án của bạn, và rằng một mô hình là một sơ khai với logic điều kiện vào nó.

Một điều khác mà tôi nghĩ rằng tôi đã chọn là mocks là bằng cách nào đó liên quan đến tiêm phụ thuộc, một khái niệm mà tôi chỉ quản lý để hiểu ngày hôm qua.

Điều tôi không hiểu là tại sao tôi thực sự sử dụng chúng. Tôi dường như không thể tìm thấy bất kỳ ví dụ cụ thể nào trên mạng mà giải thích chúng đúng cách.

Có ai vui lòng giải thích cho tôi về khái niệm này không?

+2

Đọc http://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and%20Dummies.html và http://martinfowler.com/articles/mocksArentStubs.html – blank

+1

Và khi bạn đang ở bạn cũng có thể đọc http://www.mockobjects.com/files/mockrolesnotobjects.pdf – blank

+0

Tôi hy vọng bạn sẽ tha thứ cho thương mại, nhưng chúng tôi đã viết toàn bộ cuốn sách "Phát triển phần mềm hướng đối tượng", giải quyết động lực cho sử dụng mocks. –

Trả lời

19

Như tôi đã đọc trong quá khứ, đây là những gì tôi tin rằng mỗi học kỳ là viết tắt của

Stub

Ở đây bạn đang stubbing kết quả của một phương pháp để một giá trị đã biết, chỉ cần để cho các mã chạy mà không có sự cố. Ví dụ: giả sử bạn có các thông tin sau:

public int CalculateDiskSize(string networkShareName) 
{ 
    // This method does things on a network drive. 
} 

Bạn không quan tâm giá trị trả về của phương thức này là gì, nó không liên quan. Thêm vào đó nó có thể gây ra một ngoại lệ khi được thực thi nếu ổ đĩa mạng không có sẵn. Vì vậy, bạn hãy đưa ra kết quả để tránh các vấn đề thực thi tiềm năng với phương thức.

Vì vậy, bạn sẽ làm cái gì đó như:

sut.WhenCalled(() => sut.CalculateDiskSize()).Returns(10); 

Fake

Với giả bạn đang trở về dữ liệu giả, hoặc tạo ra một trường hợp giả mạo của một đối tượng. Một ví dụ cổ điển là các lớp kho lưu trữ. Sử dụng phương pháp này:

public int CalculateTotalSalary(IList<Employee> employees) { } 

Thông thường phương thức trên sẽ được thông qua một tập hợp các nhân viên được đọc từ cơ sở dữ liệu. Tuy nhiên trong các bài kiểm tra đơn vị của bạn, bạn không muốn truy cập cơ sở dữ liệu. Vì vậy, bạn tạo danh sách nhân viên giả mạo:

IList<Employee> fakeEmployees = new List<Employee>(); 

Sau đó, bạn có thể thêm các mục vào fakeEmployees và xác nhận kết quả mong đợi, trong trường hợp này là tổng tiền lương.

Mocks

Khi sử dụng các đối tượng giả bạn có ý định để xác minh một số hành vi, hoặc dữ liệu, trên những đối tượng giả. Ví dụ:

Bạn muốn xác minh rằng một phương pháp cụ thể được thực hiện trong quá trình chạy thử nghiệm, đây là một ví dụ generic sử dụng Moq khuôn khổ chế giễu:

public void Test() 
{ 
    // Arrange. 
    var mock = new Mock<ISomething>(); 

    mock.Expect(m => m.MethodToCheckIfCalled()).Verifiable(); 

    var sut = new ThingToTest(); 

    // Act. 
    sut.DoSomething(mock.Object); 

    // Assert 
    mock.Verify(m => m.MethodToCheckIfCalled()); 
} 

Hy vọng rằng ở trên sẽ giúp làm sáng tỏ mọi thứ một chút.

EDIT: Roy Osherove cũng là người ủng hộ sự phát triển thử nghiệm và có một số thông tin rất tốt về chủ đề này.Bạn có thể tìm thấy nó rất hữu ích:

http://artofunittesting.com/

+0

rất thông tin. Tôi luôn nghĩ hàng giả và mocks có thể hoán đổi cho nhau. Tôi học những thứ mới mỗi ngày ở đây :) +1 – bas

+0

whats 'm' trong Mocks? và IS IS là lớp chúng tôi đang thử nghiệm? – fersarr

+0

'm' là một tham số được chuyển vào hàm' Expect() '. Nó là một biểu thức lambda. Nó không được khai báo ở bất cứ đâu, nó đơn giản tồn tại bên trong 'lambda' Mong đợi(). 'var mock = new Mock ();' có nghĩa là bạn đang tạo một đối tượng thực hiện 'ISomething', Vì vậy,' ISomething' là một giao diện, không phải là một đối tượng. Sau đó, bạn có thể sử dụng 'mock' để kiểm soát cách các phương thức đáp ứng khi chúng được gọi, thông qua hàm' Expect() 'chẳng hạn. –

0

Sổ tay này Unit của PHP giúp tôi rất nhiều khi giới thiệu:

"Đôi khi nó chỉ là đồng bằng khó để kiểm tra hệ thống được kiểm tra (SUT) vì nó phụ thuộc Điều này có thể là do chúng không có sẵn, chúng sẽ không trả lại kết quả cần thiết cho thử nghiệm hoặc vì thực thi chúng sẽ có tác dụng phụ không mong muốn. chúng tôi có nhiều quyền kiểm soát hoặc khả năng hiển thị của hành vi nội bộ của SUT. " Nhiều hơn: https://phpunit.de/manual/current/en/test-doubles.html

Và tôi tìm thấy "giới thiệu" tốt hơn khi tìm kiếm "kiểm tra tăng gấp đôi" như mocks, hàng giả, sơ khai và những người khác được biết đến.

3

Tất cả đều là các biến thể của Kiểm tra đôi. Đây là một tài liệu tham khảo rất tốt giải thích sự khác biệt giữa chúng: http://xunitpatterns.com/Test%20Double.html

Ngoài ra, từ bài Martin Fowler: http://martinfowler.com/articles/mocksArentStubs.html

Mészáros sử dụng thuật ngữ Kiểm tra đúp là thuật ngữ chung cho bất kỳ loại giả vờ đối tượng đã sử dụng thay cho một đối tượng thực sự cho mục đích thử nghiệm. Cái tên xuất phát từ khái niệm về Stunt Double trong phim. (Một trong những mục tiêu của ông là để tránh sử dụng bất kỳ tên đó đã được sử dụng rộng rãi.) Mészáros sau đó được xác định bốn loại đặc biệt của đôi:

  1. đối tượng giả: được thông qua xung quanh nhưng không bao giờ thực sự được sử dụng. Thông thường họ chỉ được sử dụng để điền vào danh sách tham số.
  2. Đối tượng giả thực sự có triển khai công việc, nhưng thường có một số phím tắt làm cho chúng không phù hợp để sản xuất (một cơ sở dữ liệu bộ nhớ là ví dụ tốt ).
  3. Sơ khai cung cấp câu trả lời soạn trước cho các cuộc gọi được thực hiện trong khi kiểm tra, thường không trả lời bất kỳ điều gì ngoài những gì được lập trình trong để kiểm tra. Cuống cũng có thể ghi lại thông tin về các cuộc gọi, chẳng hạn như một thư mục cổng email ghi nhớ các thư được 'gửi' hoặc có thể chỉ có bao nhiêu thư được gửi '.
  4. Mocks là những gì chúng ta đang nói đến ở đây: các đối tượng được lập trình sẵn với các kỳ vọng tạo thành một đặc điểm của các cuộc gọi mà chúng được mong đợi nhận được.

Trong số các loại tăng gấp đôi này, chỉ mocks xác nhận khi xác minh hành vi. khác đôi có thể, và thường làm, sử dụng xác minh nhà nước. Mocks thực sự hoạt động giống như đôi khác trong giai đoạn tập thể dục, như họ cần phải làm cho SUT tin rằng nó đang nói chuyện với các cộng tác viên thực sự của nó .

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