Como parte de una unidad de prueba que estoy tratando de burlarse del valor de retorno de FormsIdentity.Ticket.UserDataque imita FormsIdentity.Ticket.UserData con Moq
El siguiente no funcionará pero debería dar una idea de lo que soy tratando de hacer:
var principal = Mock<IPrincipal>();
var formsIdentity = Mock<FormsIdentity>();
formsIdentity.Setup(a => a.Ticket.UserData).Returns("aaa | bbb | ccc");
principal.Setup(b => b.Identity).Returns(formsIdentity.Object);
el código que estoy tratando de prueba se ve algo como esto:
FormsIdentity fIdentity = HttpContext.Current.User.Identity as FormsIdentity;
string userData = fIdentity.Ticket.UserData;
Todo lo que quiero hacer en mi unidad de prueba es falso el valor de retorno de FormsIdentity.Ti cket.UserData. Pero cuando ejecuto el código en la primera sección, aparece un error al intentar simular el FormsIdentity. El error dice que el tipo para simular debe ser una interfaz, clase abstracta o clase no sellada.
Intenté usar IIdentity en lugar de FormsIdentity (FormsIdentity es una implementación de IIdentity) pero IIdentity no tiene .Ticket.UserData.
Entonces, ¿cómo puedo escribir esta prueba para que obtenga un valor de FormsIdentity.Ticket.UserData?
Resulta que el método que estaba tratando de prueba estaba haciendo demasiado. Violaba el patrón de responsabilidad individual que dificultaba la prueba. Desde entonces he refactorizado el método. En cuanto a la pregunta original, no parece que haya ninguna forma de burlarse de FormsIdentity.Ticket.UserData, ya que es parte de una clase que está sellada – codette