2012-11-23 43 views
5

Tôi có một lớp học (cho phép gọi nó là A) rằng:Làm thế nào để đơn vị kiểm tra một lớp tiêu thụ một dịch vụ web?

  • Trong constructor có một cấu hình và dựa vào nó, tạo ra một cuống một dịch vụ web và lưu trữ một tham chiếu đến nó trong một lĩnh vực tư nhân.
  • Có một vài phương pháp gọi phương thức web và một số nội dung trong đó.

tôi bắt đầu để tạo ra một thử nghiệm đơn vị đó:

  • Tạo một thể hiện của một lớp A với một cấu hình nộm.
  • Thông qua phản chiếu, nó sẽ tiêm phần dịch vụ web giả mạo.

Mặc dù dịch vụ web đó có nhiều phương pháp.

  • Tôi có nên thử tất cả (trong mọi thử nghiệm, với dữ liệu khác nhau) không?
  • Hoặc có lẽ tôi nên tạo một lớp khác chỉ gói gọn các phương pháp web đang được sử dụng?
  • Hoặc có cách tiếp cận khác?
+1

Cảm ơn! Không biết về tính năng đó! – Janek

Trả lời

5

Bạn nên tạo giao diện trình bao bọc xung quanh dịch vụ web của mình và làm cho lớp của bạn đang được thử nghiệm phụ thuộc vào giao diện đó, thay vì trực tiếp trên webservice; bạn có thể thử giao diện. Chỉ làm cho giao diện đó hiển thị các phương thức của webservice mà bạn thấy thú vị. Điều này được gọi là mẫu mặt tiền và được chi tiết here.

Nếu không có một đầu mối về những gì bạn đang thử nghiệm, nhằm mục đích cho một cái gì đó như thế này:

public interface IWebserviceWrapper 
{ 
    Whatever DoStuff(int something); 
} 

public class WebserviceWrapper : IWebserviceWrapper 
{ 
    private WebService _theActualWebservice; 

    public WebserviceWrapper(Webservice theService) 
    { 
     _theActualWebService = theService; 
    } 

    public Whatever DoStuff(int something) 
    { 
     return _theActualWebservice.DoSomething(something); 
    } 

} 

Sau đó, kiểm tra của bạn sẽ trông như thế này (trong trường hợp này, sử dụng MOQ)

public void Test_doing_something() 
{ 
    Mock<IWebserviceWrapper> _serviceWrapperMock = new Mock<IWebserviceWrapper>(); 

    _serviceWrapperMock.SetUp(m => m.DoStuff(12345)).Returns(new Whatever()); 

    var classUnderTest = new ClassUnderTest(_serviceWrapperMock.Object); 

    var result = classUnderTest.Dothings(12345); 

    Assert.Whatever.... 

} 
+0

Cảm ơn. Vì vậy, về cơ bản bạn đề xuất giải pháp số 2 từ những giải pháp mà tôi đã liệt kê. Nhưng sau đó những gì về đơn vị kiểm tra lớp bổ sung này? Tôi nghĩ rằng tại một số điểm tôi sẽ phải thử tất cả các phương pháp, phải không? Nguyên nhân nếu không tôi sẽ phải giả định rằng một số phương pháp theo thử nghiệm chỉ sử dụng một tập hợp con cố định của các phương pháp web có sẵn - đó không phải là một giả định thích hợp khi thử nghiệm đơn vị, điều này có đúng không? – Janek

+0

Tùy chọn 2, có. Bạn không nên thực sự cần phải kiểm tra đơn vị giao diện hoặc lớp của trình bao bọc, vì tất cả những gì nó đang thực hiện là ủy nhiệm bất kỳ cuộc gọi nào được thực hiện cho đến dịch vụ của bên thứ ba.Vì vậy, đơn vị kiểm tra lớp đó có nghĩa là đơn vị thử nghiệm dịch vụ web, và đó không phải là một bài kiểm tra đơn vị nữa, đó là một bài kiểm tra tích hợp. Ngoài ra, bằng cách sử dụng "chỉ một tập con cố định của phương pháp web có sẵn" là chính xác điểm của mặt tiền –

+0

Cảm ơn Greg. Điều đó có ý nghĩa! – Janek

1

Câu trả lời ngắn Có :). Câu trả lời dài bạn nên sử dụng một số loại mocking lib ví dụ: http://code.google.com/p/mockito/ và trong thử nghiệm đơn vị của bạn giả lập cuống WS và chuyển nó đến lớp được kiểm tra. Đó là cách của lực lượng :)

1

Khi bạn kiểm tra một lớp, bạn luôn muốn đảm bảo chỉ kiểm tra lớp đó và không bao gồm các phụ thuộc của nó. Để làm điều đó, bạn sẽ phải giả lập WS của bạn để nó trả về dữ liệu giả khi các phương thức được gọi. Tùy thuộc vào kịch bản của bạn, bạn không phải thử tất cả các phương thức cho mỗi bài kiểm tra, tôi sẽ chỉ nói những phương thức được sử dụng.

Ví dụ về chế nhạo, bạn có thể đọc bài viết này: http://written-in-codes.blogspot.ca/2011/11/unit-tests-part-deux.html

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