Ho un apparecchio di prova unità in cui sto provando a testare ControllerAction su un controller ASP.NET MVC che viene utilizzato per le funzioni di appartenenza su un'app Web. Sto cercando di deridere HttpContext per i test. Il ControllerAction in prova in realtà imposta le proprietà sul HttpContext, come i valori di sessione, valori Response.Cookies, ecc Questo non è tutto il codice, ma qui è un esempio di massima del test che sto cercando di arrivare a correre :Mocking HttpContextBase con Moq
[Test]
public void ValidRegistrationDataSuccessfullyCreatesAndRegistersUser()
{
var context = new Mock<HttpContextBase>() {DefaultValue = DefaultValue.Mock};
context.SetupAllProperties();
var provider = new Mock<MembershipProvider>(new object[] {context.Object});
var controller = new AccountController(context.Object, provider.Object);
// This just sets up a local FormCollection object with valid user data
// in it to use to attempt the registration
InitializeValidFormData();
ActionResult result = controller.Register(_registrationData);
Assert.IsInstanceOfType(typeof(ViewResult), result);
// Here is where I'd like to attempt to do Assertions against properties
// of the HttpContext, like ensuring that a Session object called "User"
// exists, and new auth cookie exists on the Response.Cookies collection.
// So far I've been unable to successfully check the values of those properties.
// I've been unsuccessful in getting those properties setup correctly on my
// mock object so that my ControllerAction can actually *set* their values,
// and that I can make assertions on them afterwards. The above code actually
// generates a StackOverflowException (which I've reported) on the
// context.SetupAllProperties() call. What am I doing wrong, or what do I need
// to do to be able to set and assert on those context properties?
}
Non sei sicuro di quello che sto facendo male, ma mi piacerebbe se qualcuno mi potrebbe punto nella giusta direzione e mi ha spiegato come preparare questo oggetto HttpContextBase finta tale che il mio controller può effettivamente impostare i valori sulle sue proprietà, e posso fare asserzioni su quelle proprietà per assicurarmi che la mia ControllerAction stia facendo quello che mi serve.
Mi sto avvicinando a questo nel modo sbagliato? So che Controller MVC hanno un ControllerContext che posso usare per impostare i valori per la sessione, ecc, ma non riesco a capire come una cosa del genere potesse essere preso in giro senza iniettare esso. C'è un modo per farlo, invece? (Devo anche essere in grado di passare il contesto al mio MembershipProvider) Sarebbe un approccio migliore?
Grazie.
Ho il suo libro, ma l'ho preso solo un paio di giorni fa, quindi credo di non aver ancora ottenuto quella parte. Se tu potessi indicarmi la sezione di quel libro da cui hai preso il codice di esempio, sarebbe fantastico. Grazie mille. –
Controlla la fine di ch.9. Non ce l'ho davanti, ma sembra che stia dando un'occhiata al sommario del libro su Amazon. –
Trovato. Era esattamente * quello di cui avevo bisogno. Ha funzionato tutto ora. Grazie mille. –