سؤال

أقوم ببعض الصيانة على تطبيق ويب أقدم مكتوب في Monorail v1.0.3. أريد وحدة اختبار الإجراء الذي يستخدم RenderText (). كيف يمكنني استخراج المحتوى في اختباري؟ القراءة من Controller.Response.outputStream لا تعمل ، لأن دفق الاستجابة إما لا يتم إعداده بشكل صحيح في PrepareController () ، أو يتم إغلاقه في RenderText ().

مثال على الإجراء

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 + " }" );
}

اختبار مثال (باستخدام MOQ)

[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 );
}
هل كانت مفيدة؟

المحلول

تجاوز BaseControllerTest.BuildResponse() وتوفير وهمية الخاصة بك IMockResponse بنيت مع موك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top