代码之家  ›  专栏  ›  技术社区  ›  MikeWyatt

单轨RenderText方法的单元测试

  •  0
  • MikeWyatt  · 技术社区  · 14 年前

    我正在对monorail v1.0.3中编写的旧web应用程序进行一些维护。我要对使用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 );
    }
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   Mauricio Scheffer    14 年前

    重写 BaseControllerTest.BuildResponse() 提供你的嘲笑 IMockResponse 使用MOQ制造。

    推荐文章