モノレールのレンダテキスト法の単体テスト
-
21-09-2019 - |
質問
Monorail v1.0.3で書かれた古いWebアプリケーションでメンテナンスを行っています。 rendertext()を使用するアクションをユニットテストしたい。テストでコンテンツを抽出するにはどうすればよいですか? controller.response.outputStreamから読み取りは機能しません。応答ストリームはpreperecontroller()で適切にセットアップされていないか、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
Moqで建てられました。
所属していません StackOverflow