Question

Je fais un peu d'entretien sur une application web plus écrit en monorail v1.0.3. Je veux tester l'unité d'une action qui utilise renderText (). Comment puis-je extraire le contenu dans mon test? La lecture de controller.Response.OutputStream ne fonctionne pas, puisque le flux de réponse est soit pas configuré correctement dans PrepareController (), ou est fermé renderText ().

Exemple Action

public DeleteFoo( int id )
{
    var success= false;
    var foo = Service.Get<Foo>( id );
    if( foo != null && CurrentUser.IsInRole( "CanDeleteFoo" ) )
    {
        Service.Delete<Foo>( id );
        success = true;
    }

    CancelView();
    RenderText( "{ success: " + success + " }" );
}

Exemple de test (en utilisant QMC)

[Test]
public void DeleteFoo()
{
    var controller = new FooController ();
    PrepareController ( controller );

    var foo = new Foo { Id = 123 };

    var mockService = new Mock < Service > ();
    mockService.Setup ( s => s.Get<Foo> ( foo.Id ) ).Returns ( foo );
    controller.Service = mockService.Object;

    controller.DeleteTicket ( foo.Id );

    mockService.Verify ( s => s.Delete<Foo> ( foo.Id ) );
    Assert.AreEqual ( "{success:true}", GetResponse ( Response ) );
}

// response.OutputStream.Seek throws an "System.ObjectDisposedException: Cannot access a closed Stream." exception
private static string GetResponse( IResponse response )
{
    response.OutputStream.Seek ( 0, SeekOrigin.Begin );
    var buffer = new byte[response.OutputStream.Length];
    response.OutputStream.Read ( buffer, 0, buffer.Length );
    return Encoding.ASCII.GetString ( buffer );
}
Était-ce utile?

La solution

Override BaseControllerTest.BuildResponse() et fournir votre maquette de IMockResponse construit avec Moq.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top