2010-03-23 45 views
0

我正在对使用Monorail v1.0.3编写的旧版Web应用程序进行一些维护。我想单元测试一个使用RenderText()的动作。我如何在我的测试中提取内容?从controller.Response.OutputStream读取不起作用,因为响应流要么在PrepareController()中没有正确设置,要么在RenderText()中关闭。单元测试Monorail的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); 
} 

回答

3

覆盖BaseControllerTest.BuildResponse()并提供您的IMockResponse起订量与模拟建造。