2010-02-12 32 views
6

Khi đơn vị kiểm tra một codebase, các dấu hiệu báo hiệu mà tôi cần sử dụng các đối tượng giả là gì?Kiểm tra đơn vị các phương thức void/các ký hiệu mocking đối tượng dấu hiệu câu chuyện

Điều này có đơn giản như nhìn thấy nhiều cuộc gọi đến các đối tượng khác trong codebase không?

Ngoài ra, làm cách nào để đơn vị thử nghiệm các phương thức không trả về giá trị? Vì vậy, nếu tôi một phương pháp là trở về void nhưng in vào một tập tin, tôi chỉ cần kiểm tra nội dung của tập tin?

Mocking là phụ thuộc bên ngoài, vì vậy đó là nghĩa đen mọi thứ, phải không? Hệ thống tệp, db, mạng, v.v ...

+0

Để kiểm tra điểm cuối cùng của bạn: http://martinfowler.com/articles/mocksArentStubs.html chỉ để đảm bảo bạn nhận thức được sự khác biệt. – Finglas

+0

Dưới đây là một số đọc tốt để giải quyết một số câu hỏi sau: http://xunitpatterns.com/TestStrategy.html –

Trả lời

2

Nếu có, tôi có thể sử dụng quá nhiều mocks.

Bất cứ khi nào một lớp gọi điện cho người khác, nói chung tôi giả định cuộc gọi đó và tôi xác minh rằng cuộc gọi được thực hiện với thông số chính xác. Ở những nơi khác, tôi sẽ có một bài kiểm tra đơn vị kiểm tra mã cụ thể của đối tượng bị giả mạo hoạt động chính xác.

Ví dụ:

[Test] 
public void FooMoo_callsBarBaz_whenXisGreaterThan5() 
{ 
    int TEST_DATA = 6; 
    var bar = new Mock<Bar>(); 
    bar.Setup(x => x.Baz(It.Is<int>(i == TEST_DATA))) 
     .Verifiable(); 

    var foo = new Foo(bar.Object); 

    foo.moo(TEST_DATA); 

    bar.Verify(); 
} 

... 
[Test] 
public void BarBaz_doesSomething_whenCalled() 
{ 
    // another test 
} 

Điều đối với tôi là, nếu tôi cố gắng để kiểm tra rất nhiều lớp học như một glob lớn, sau đó thường tấn mã thiết lập. Không chỉ là điều này khá khó hiểu khi đọc khi bạn cố gắng để có được đầu của bạn xung quanh tất cả các phụ thuộc, nó rất dễ vỡ khi thay đổi cần phải được thực hiện.

Tôi rất thích các bài kiểm tra ngắn gọn nhỏ. Dễ viết hơn, dễ bảo trì hơn, dễ hiểu hơn mục đích của bài kiểm tra.

+4

Bạn kết thúc thử nghiệm liên kết với chi tiết triển khai nội bộ bằng mocks có nghĩa là chúng có xu hướng phá vỡ thường xuyên hơn. Với thử nghiệm trạng thái, bạn chỉ quan tâm đến đầu ra. Mocks thường lộn xộn hơn để thiết lập, nhưng họ chắc chắn có vị trí của họ trong thử nghiệm đơn vị. – Finglas

-1

Kiểm tra đơn vị chỉ dành cho một đoạn mã hoạt động độc lập trong chính nó. Điều này có nghĩa là nó không phụ thuộc vào các đối tượng khác để thực hiện công việc của nó. Bạn nên sử dụng mocks nếu bạn đang làm lập trình Test-Driven hoặc Test-First programming. Bạn sẽ tạo một mô hình (hoặc sơ khai như tôi muốn gọi nó) của hàm mà bạn sẽ tạo và thiết lập các điều kiện nhất định để thử nghiệm vượt qua. Ban đầu hàm trả về false và test không thành công, được mong đợi ... sau đó bạn viết mã để thực hiện công việc thực cho đến khi nó trôi qua.

Nhưng những gì tôi nghĩ bạn đang đề cập đến là thử nghiệm tích hợp, không phải thử nghiệm đơn vị. Trong trường hợp đó, bạn nên sử dụng mocks nếu bạn đang chờ các lập trình viên khác hoàn thành công việc của họ và bạn hiện không có quyền truy cập vào các chức năng hoặc đối tượng mà họ đang tạo. Nếu bạn biết giao diện, mà hy vọng bạn làm khác mocking là vô nghĩa và một sự lãng phí thời gian, sau đó bạn có thể tạo ra một phiên bản dumbed xuống của những gì bạn đang hy vọng sẽ có được trong tương lai.

Trong ngắn hạn, mocks được sử dụng tốt nhất khi bạn đang chờ đợi người khác và cần một cái gì đó ở đó để hoàn thành công việc của bạn.

Bạn nên cố gắng luôn trả lại giá trị nếu có thể. Đôi khi bạn gặp phải các vấn đề mà bạn đã trả về một cái gì đó, nhưng trong C và C++ bạn có thể có các tham số đầu ra và sau đó sử dụng giá trị trả về để kiểm tra lỗi.

+0

-1 - Điều này được dựa trên một sự hiểu lầm của mocks và khai. Mặc dù bạn chắc chắn đã có chức năng khi thực hiện TDD, nhưng đó không phải là đối tượng giả. Bạn không chế nhạo đối tượng đang thử nghiệm, bạn giả lập các phụ thuộc của nó. – TrueWill

+0

Vâng, tôi đoán có sự khác biệt giữa cuống và mocks. Tôi nghĩ rằng bạn hiểu lầm những gì tôi đã nói. Trong đoạn đầu tiên tôi đã mô tả các bài kiểm tra đơn vị là gì và cách bạn có thể sử dụng một đối tượng mà bạn đã tạo mô phỏng một đối tượng thực mà bạn hiện không có quyền truy cập hoặc không quan tâm để có quyền truy cập. Trong đoạn thứ hai tôi bắt đầu mô tả rằng mocks là để thử nghiệm tích hợp ... nhưng tôi đã sai. Kiểm thử tích hợp được thực hiện sau khi kiểm tra đơn vị và được thực hiện với các đối tượng thực, chứ không phải mocks. Dù bằng cách nào, mocks được sử dụng tốt nhất khi bạn muốn làm thử nghiệm đơn vị trước khi bạn tích hợp. –

0

Mocks/stubs/fakes/test double/etc. là tốt trong các bài kiểm tra đơn vị, và cho phép kiểm tra lớp/hệ thống được kiểm tra trong sự cô lập. Kiểm tra tích hợp có thể không sử dụng bất kỳ mocks nào; họ thực sự nhấn vào cơ sở dữ liệu hoặc phụ thuộc bên ngoài khác.

Bạn sử dụng mô hình hoặc sơ khai khi cần. Nói chung điều này là do lớp bạn đang cố kiểm tra có sự phụ thuộc vào giao diện. Đối với TDD, bạn muốn lập trình giao diện, không triển khai và sử dụng tiêm phụ thuộc (nói chung).

Một trường hợp rất đơn giản:

public class ClassToTest 
{ 
    public ClassToTest(IDependency dependency) 
    { 
     _dependency = dependency; 
    } 

    public bool MethodToTest() 
    { 
     return _dependency.DoSomething(); 
    } 
} 

IDependency là một giao diện, có thể là một với cuộc gọi đắt (truy cập cơ sở dữ liệu, các cuộc gọi dịch vụ web, vv). Một phương pháp thử nghiệm có thể chứa mã tương tự như:

// Arrange 

var mock = new Mock<IDependency>(); 

mock.Setup(x => x.DoSomething()).Returns(true); 

var systemUnderTest = new ClassToTest(mock.Object); 

// Act 

bool result = systemUnderTest.MethodToTest(); 

// Assert 

Assert.That(result, Is.True); 

Lưu ý rằng tôi đang thực hiện kiểm tra trạng thái (như @Finglas đề xuất) và tôi chỉ khẳng định hệ thống đang được kiểm tra (ví dụ của lớp I ' m thử nghiệm). Tôi có thể kiểm tra các giá trị thuộc tính (trạng thái) hoặc giá trị trả về của một phương thức, như trường hợp này cho thấy.

Tôi khuyên bạn nên đọc The Art of Unit Testing, đặc biệt nếu bạn đang sử dụng .NET.

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