2012-02-06 8 views
6

La clase particular que estoy probando depende del objeto HttpSessionState.¿Clases falsas selladas sin constructores públicos?

La clase HttpSessionState no tiene constructores públicos. La clase bajo prueba solo está utilizando este objeto como una tienda NameValue. La clase se usa en un servicio web ASMX para devolver información de un método en particular.

Estoy pensando en crear una fachada alrededor de la clase HttpSessionState donde puedo proporcionar una cadena de diccionario <, cadena > en lugar del objeto Session en la prueba.

¿Es esta una buena idea o una práctica estándar?

Respuesta

8

Sí, como dice el refrán, no hay nada que no se pueda resolver agregando otra capa de abstracción. Normalmente solo oculto el tipo detrás de una interfaz donde los métodos de la interfaz son los únicos necesarios para realizar las acciones que deseo en ese tipo.

Sólo burlarse de la interfaz que se esconde HttpSessionState, y hacer Afirma sobre los usos de la interfaz, en la burla de Rhino es sólo AssertWasCalled (d => ....), etc.

+3

"no hay nada que no pueda resolverse agregando otra capa de abstracción" - excepto "a muchas capas de abstracciones" =) – Restuta

+0

Creo que el original era "no hay nada que otro nivel de indirección no pueda resolver". " En algún momento, no podrá probar un nivel, como el que está ocultando en httpsessionstate. No está familiarizado con él, pero adivina que realmente no puede probarlo en una unidad, pero puede probar el SUT si está utilizando un nivel. escribe así para hacer "algo". –

+0

No me importa el original, es verdad =) – Restuta

2

Se puede crear una subclase de la clase HttpSessionStateBase. This answer muestra cómo implementar esto para Moq, pero aún puede usar la clase MockHttpSession con sus Rhino Mocks (supongo. No he usado 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; } 
    } 
} 

Una bastante extensa discusión sobre cómo burlarse de clases .NET se puede encontrar en el blog de Scott Hanselman here.

+0

¿La clase HttpSessionStateBase está disponible para servicios web? –

+0

@PeterSmith HttpSessionStateBase está en el espacio de nombres System.Web, si eso es lo que quiere decir. – jhsowter

2

Puede burlarse de cualquier tipo incluso los sellados usando Microsoft's Moles Isolation framework for .NET. Toma un poco de trabajo configurarlo, pero podría ser mejor que agregar otra capa de abstracción. Burlarse de HttpContext y HttpSessionState usando moles se discute here. Hay otra discusión similar here.

+1

No estoy seguro de que para obtener otra dependencia de proyecto, leer como "nuevo marco de aislamiento" es una solución más simple (leer como mejor) que una pequeña abstracción. – Restuta

+0

@Restuta, sí, probablemente tengas razón, pero es una opción y responde al menos el título de la pregunta "Clases falsas selladas" –

Cuestiones relacionadas