2012-02-06 23 views
6

Lớp cụ thể mà tôi đang thử nghiệm phụ thuộc vào đối tượng HttpSessionState.Mocking các lớp kín mà không có các nhà thầu công khai?

Lớp HttpSessionState không có nhà thầu công khai. Lớp được thử nghiệm chỉ sử dụng đối tượng này như một cửa hàng NameValue. Lớp này được sử dụng trong một dịch vụ web ASMX để trả về thông tin cho một phương thức cụ thể.

Tôi đang suy nghĩ về việc tạo mặt tiền quanh lớp HttpSessionState nơi tôi có thể cung cấp chuỗi < từ điển, chuỗi > thay vì đối tượng Phiên trong thử nghiệm.

Đây có phải là ý tưởng hay hoặc thực hành tiêu chuẩn không?

Trả lời

8

Đúng, như câu nói cũ không có gì không thể giải quyết bằng cách thêm một lớp trừu tượng khác. Tôi thường chỉ ẩn loại đằng sau một giao diện mà các phương thức của giao diện là những phương thức duy nhất cần thiết để thực hiện các hành động mà tôi muốn trên loại đó.

Chỉ cần thử giao diện mà giấu đi HttpSessionState, và làm Khẳng định về việc sử dụng của giao diện, trong Rhino Mocks nó chỉ AssertWasCalled (d => ....) vv

+3

"không có gì không thể giải quyết bằng cách thêm một lớp trừu tượng" - ngoại trừ "vào nhiều lớp trừu tượng" =) – Restuta

+0

Tôi tin rằng bản gốc là, "không có gì mà một mức độ khác không thể giải quyết được. " Tại một số điểm, bạn sẽ không thể kiểm tra mức độ, chẳng hạn như những gì bạn đang ẩn httpsessionstate. Không quen thuộc với nó nhưng bạn không thể thực sự kiểm tra nó, nhưng bạn có thể kiểm tra SUT nếu nó sử dụng gõ như thế này để làm "một cái gì đó". –

+0

Tôi không quan tâm đến bản gốc, nó chỉ đúng =) – Restuta

2

Bạn có thể tạo một sub-class của lớp HttpSessionStateBase. This answer cho thấy cách thực hiện điều này cho Moq, nhưng bạn vẫn có thể sử dụng lớp MockHttpSession với Rhino Mocks của bạn (tôi giả sử. Tôi chưa sử dụng Rhino Mocks).

public class MockHttpSession : HttpSessionStateBase 
{ 
    Dictionary<string, object> sessionStorage = new Dictionary<string, object>(); 

    public override object this[string name] 
    { 
     get { return sessionStorage[name]; } 
     set { sessionStorage[name] = value; } 
    } 
} 

Một cuộc thảo luận khá rộng rãi về cách chế nhạo các lớp .NET. Có thể tìm thấy blog Scottcủa Scott Hanselman.

+0

là lớp HttpSessionStateBase có sẵn cho các dịch vụ web? –

+0

@PeterSmith HttpSessionStateBase nằm trong không gian tên System.Web, nếu đó là ý của bạn. – jhsowter

2

Bạn có thể thử bất kỳ loại nào thậm chí được niêm phong bằng cách sử dụng Microsoft's Moles Isolation framework for .NET. Mất một chút công việc để thiết lập nhưng có thể tốt hơn là thêm một lớp trừu tượng khác. Mocking HttpContextHttpSessionState sử dụng nốt ruồi được thảo luận here. Có một cuộc thảo luận tương tự khác here.

+1

Tôi không chắc chắn rằng để có được một phụ thuộc dự án khác, đọc là "khung cách ly thương hiệu mới" là giải pháp đơn giản hơn (đọc tốt hơn) mà một trừu tượng nhỏ bé. – Restuta

+0

@Restuta, vâng, bạn có thể đúng, nhưng đó là một lựa chọn và câu trả lời ít nhất là tiêu đề của câu hỏi "Mocking classes" –

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