Question

Je travaille sur une application ASP.NET MVC et j'essaie d'écrire des tests unitaires sur les actions du contrôleur, dont certaines manipulent des propriétés sur le HttpContext, telles que Session, Request.Cookies, Response.Cookies, etc. J'ai du mal à comprendre comment "Arranger, Agir, Assert" ... Je peux voir Arranger et Assert ... mais j'ai du mal à comprendre comment "Agir". sur les propriétés d'une base HttpContextBase fictive lorsque toutes ses propriétés ont uniquement des accesseurs. Je ne peux pas définir quoi que ce soit sur mon contexte simulé à partir de mes actions de contrôleur ... cela ne semble donc pas très utile. Je suis assez nouveau pour me moquer, alors je suis sûr que quelque chose me manque, mais il me semble logique que je devrais être capable de créer un objet fictif que je peux utiliser dans le contexte de tests d'actions de contrôleur où je peut réellement définir des valeurs de propriété, puis plus tard, affirmer qu’elles sont toujours conformes à celles que je mets, ou quelque chose du genre. Qu'est-ce qui me manque?

    public static HttpContextBase GetMockHttpContext()
    {
        var requestCookies = new Mock<HttpCookieCollection>();
        var request = new Mock<HttpRequestBase>();
        request.Setup(r => r.Cookies).Returns(requestCookies.Object);
        request.Setup(r => r.Url).Returns(new Uri("http://example.org"));

        var responseCookies = new Mock<HttpCookieCollection>();
        var response = new Mock<HttpResponseBase>();
        response.Setup(r => r.Cookies).Returns(responseCookies.Object);

        var context = new Mock<HttpContextBase>();

        context.Setup(ctx => ctx.Request).Returns(request.Object);
        context.Setup(ctx => ctx.Response).Returns(response.Object);
        context.Setup(ctx => ctx.Session).Returns(new Mock<HttpSessionStateBase>().Object);
        context.Setup(ctx => ctx.Server).Returns(new Mock<HttpServerUtilityBase>().Object);
        context.Setup(ctx => ctx.User).Returns(GetMockMembershipUser());
        context.Setup(ctx => ctx.User.Identity).Returns(context.Object.User.Identity);
        context.Setup(ctx => ctx.Response.Output).Returns(new StringWriter());

        return context.Object;
    }
Était-ce utile?

La solution

Hé, je pense que vous rencontrez juste un peu de déconnexion ici, pas grave. Ce que vous décrivez est possible à 100%.

Je ne suis pas tout à fait sûr de savoir pourquoi vous ne pouvez pas définir de propriétés sur vos Mocks, mais si vous publiez le code complet de votre test, je serais ravi de le passer en revue avec vous. Juste au dessus de ma tête, je vais suggérer deux choses:

  1. Il existe une différence entre Setup () et SetupProperty (). SetupProperty () est probablement ce que vous recherchez si vous souhaitez suivre les valeurs sur les propriétés plutôt que de simplement en obtenir une fois.

  2. Vous pouvez également essayer d’appeler SetupAllProperties () sur n’importe quelle maquette sur laquelle vous devez définir une propriété.

Consultez le Démarrage rapide Moq pour quelques exemples.

Autres conseils

Je ne suis pas sûr que quelqu'un soit intéressé, mais j'ai traduit le Moq FakeHttpContext en un utilisant Rhino Mocks (mon arme de choix).

public static HttpContextBase FakeHttpContext()
        {
            var httpContext = MockRepository.GenerateMock<HttpContextBase>();
            var request = MockRepository.GenerateMock<HttpRequestBase>();
            var response = MockRepository.GenerateMock<HttpResponseBase>();
            var session = MockRepository.GenerateMock<HttpSessionStateBase>();
            var server = MockRepository.GenerateMock<HttpServerUtilityBase>();
            var cookies = new HttpCookieCollection();
            response.Stub(r => r.Cookies).Return(cookies);
            request.Stub(r => r.Cookies).Return(cookies);
            request.Stub(r => r.Url).Return(new Uri("http://test.com"));

            httpContext.Stub(x => x.Server).Return(server);
            httpContext.Stub(x => x.Session).Return(session);
            httpContext.Stub(x => x.Request).Return(request);
            httpContext.Stub(x => x.Response).Return(response);
            var writer = new StringWriter();
            var wr = new SimpleWorkerRequest("", "", "", "", writer);
            System.Web.HttpContext.Current = new System.Web.HttpContext(wr);
            return httpContext;

        }

avec une utilisation dans un test unitaire de

_httpContext = FakeHttpContext();
var cookieManager = new CookieManager(_httpContext);
string username = cookieManager.GetUsername();
_httpContext.AssertWasCalled(hc => { var dummy = hc.Request; });
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top