2012-12-11 18 views
14

Muốn Unit Test một phương pháp trong các lớp sauUnit Test một phương pháp mà trả về một khoảng trống

public class DeviceAuthorisationService : IDeviceAuthorisationService 
{ 
    private DeviceDetailsDTO deviceDetailsDTO = null; 
    private IDeviceAuthorisationRepositiory deviceAuthorisationRepositiory; 

    public DeviceAuthorisationService(IDeviceAuthorisationRepositioryService paramDeviceAuthorisationRepository) 
    { 
     deviceAuthorisationRepositiory = paramDeviceAuthorisationRepository; 
    } 

    public void AuthoriseDeviceProfile(long paramUserID, string paramClientMakeModel) 
    { 
     if (deviceDetailsDTO == null) 
      GetCellPhoneDetails(userID); 

     if (deviceDetailsDTO.IsDeviceSelected == false) 
      throw new SomeCustomExceptionA(); 

     if (deviceDetailsDTO.CellPhoneMakeModel.ToLower() != paramClientMakeModel.ToLower()) 
      throw new SomeCustomExceptionB; 
    } 

    public void UpdateDeviceStatusToActive(long userID) 
    { 
     if (deviceDetailsDTO == null) 
      throw new InvalidOperationException("UnAuthorised Device Profile Found Exception"); 

     if (deviceDetailsDTO.PhoneStatus != (short)Status.Active.GetHashCode()) 
      deviceAuthorisationRepositiory.UpdatePhoneStatusToActive(deviceDetailsDTO.DeviceID); 
    } 

    private void GetCellPhoneDetails(long userID) 
    { 
     deviceDetailsDTO = deviceAuthorisationRepositiory.GetSelectedPhoneDetails(userID); 

     if (deviceDetailsDTO == null) 
      throw new SomeCustomException() 
    } 

} 

Lưu ý:

  • Tên Phương Pháp = AuthoriseDeviceProfile trả về void
  • Phương pháp kiểm tra userSentMakeModel chống lại cái được lưu trữ trong kết hợp db
  • Nếu nó khớp - nó chỉ trả về (tức là không thay đổi trạng thái nào)

Chúng tôi sẽ kiểm tra phương pháp này bằng cách nào?

  • đã chế giễu các Repo
  • đã bao phủ kịch bản của "throws Exception"
  • Câu hỏi là làm thế nào để đơn vị kiểm tra kịch bản của mọi việc đều sử dụng CŨNG tức; s makeModel phù hợp với kho; s makeModel

Bất kỳ đề xuất thiết kế nào để làm cho bài kiểm tra này được chào đón nhiều nhất Cảm ơn bạn trước.

Trả lời

14

Vì phương thức của bạn trả về khoảng trống, nó có thể có một số tác dụng phụ mà bạn có thể kiểm tra/khẳng định.

Trong trường hợp của bạn, một tùy chọn sẽ là cung cấp bản sao mô phỏng IDeviceAuthorisationRepositioryService. Sau đó, bạn có thể kiểm tra xem có cuộc gọi đến số UpdatePhoneStatusToActive không. Đây là một giải pháp sử dụng Moq:

var mock = new Mock<IDeviceAuthorisationRepositioryService>(); 

var service = new DeviceAuthorisationService(mock.Object); 
service.UpdateDeviceStatusToActive(....); 

mock.Verify(x => service.UpdatePhoneStatusToActive(), Times.Never()); 
+0

Cảm ơn alexn - đã được sử dụng Mo q và tìm thấy nó rất hữu ích –

7

Nếu phương pháp bị vô hiệu, thì phương pháp này sẽ có một số tác dụng phụ có thể quan sát được - nếu không thì vô nghĩa. Vì vậy, thay vì kiểm tra giá trị trả về, bạn kiểm tra các tác dụng phụ. Trong trường hợp này, nó trông giống như những gì có thể xung quanh trường hợp ngoại lệ được ném trong tình huống nào.

(Ở đây, "ném một ngoại lệ" được coi là một tác dụng phụ, bạn cũng có thể nghĩ về nó như một loại tiềm ẩn của giá trị trả về tất nhiên ...)

3

Bạn có thể đặt kỳ vọng ngoại lệ về đơn vị của bạn kiểm tra. Trong nUnit nó trông như thế này:

[Test] 
[ExpectedException(typeof(InvalidOperationException))] 
public void TestAuthoriseFail() 
{ 
    // do something that should make the tested method throw the exception 
} 
5

Tiêm một kho lưu trữ giả. Kiểm tra nếu một số phương pháp nhất định trên kho lưu trữ được gọi.

2

Thậm chí nếu phương pháp của bạn trả về void, nó phải được làm một cái gì đó rất hữu ích cho bạn (nếu không nó sẽ là một phương pháp vô nghĩa có).

Từ mã của bạn, tôi đoán về cơ bản có 2 hương vị của thứ 'hữu dụng' rằng phương pháp AuthoriseDeviceProfile được thực hiện:

  • gọi phương thức GetSelectedPhoneDetails trên các ngoại lệ khác nhau IDeviceAuthorisationRepositiory
  • ném dựa trên một số điều kiện nhất định

Do đó để kiểm tra đơn vị phương pháp, bạn nên làm hai việc tương ứng với điều này:

  • Tiêm một mock IDeviceAuthorisationRepositiory và có nó ghi lại và/hoặc khẳng định dù GetSelectedPhoneDetails được gọi
  • phương pháp thử nghiệm Tập thể dục mà gây ra các trường hợp ngoại lệ khác nhau, và nắm bắt chúng khi chúng được ném để xác minh rằng:
    • một ngoại lệ là trên thực tế ném
    • ngoại lệ mà được ném là một trong những phù hợp với từng kịch bản
+0

Cảm ơn Chamila_c. Đã đề cập đến "ném ngoại lệ" trong bài kiểm tra đơn vị bằng cách gửi trong kho lưu trữ giả. Làm thế nào để chúng tôi bao gồm "tất cả đã đi kịch bản" –

+0

Thiết lập kịch bản thử nghiệm để bạn không mong đợi một ngoại lệ được ném ra, và sau đó kiểm tra xem bạn không chọn bất kỳ trường hợp ngoại lệ trong điều khoản 'bắt'. Điều này có thể đơn giản như thiết lập một giá trị boolean lên phía trước, và chỉ có mã để chuyển đổi nó trong 'bắt'. Sau đó, nếu ở cuối của thử nghiệm boolean đã giữ lại giá trị ban đầu của nó, bạn biết rằng không có trường hợp ngoại lệ đã được ném –

+0

Isnt thử bắt trong một thử nghiệm được coi là một mùi thử nghiệm? –

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