2011-12-16 18 views
4

私はrestful routing moduleをasp.net mvcに使用しており、とても満足しています。しかし、私は一つのことを得ることができません。たとえば、私はこのようなコントローラのアクションました:ユニットテストasp.net mvc快適なルーティングFormatResult

public ActionResult Index() 
{ 
    if (Request.IsAjaxRequest()) 
     return PartialView(); 
    return View(); 
} 

をそしてこのように仕様を書いても問題ありませんでした:

[Subject(typeof(LotsController))] 
public class When_Index_called 
{ 
    static LotsController controller; 

    static ActionResult actionResult; 

    Establish context =() => { 
     controller = mocker.Create<LotsController>(); 
     controller.ControllerContext = Contexts.Controller.Default; 
    }; 

    Because of =() => actionResult = controller.Index(); 

    It should_render_view =() => actionResult.AssertViewRendered().ForViewWithDefaultName(); 

をしかし、残りの部分を使用して、私はこのようなIndexメソッドを持つようにしたいです:

public ActionResult Index() 
{ 
    return RespondTo(format => { 
     format.Html =() => { 
      if (Request.IsAjaxRequest()) 
       return PartialView(); 
      return View(); 
     }; 
     format.Json =() => Json(new { }); 
    }); 
} 

アクションの結果は、タイプするViewResultの、そのタイプするformatResultではないので、以前の仕様は、失敗していることを確認してください。 FormatResult自体は、voidを返すExecuteResultメソッドをオーバーライドします。 FormatResult内のアクション結果の型とデータを検証する場合、このようなケースを単体テストできますか?

答えて

1

が可能です:

var formatResult = actionResult as FormatResult; 
ActionResult result = formatResult.ExposeResult().Html(); 
result.ShouldBeOfType<ViewResult>(); 
0

返されたビューの名前を使用することができますか?

それはあなたにフォーマットを与えませんでしたが、返されたビューをテストすることができます。

+0

私がするViewResultのインスタンスを取得することはできません – Sly

0

これは、ActionResultの使用要求によって異なります。このロジックは、FormatResultのExecuteResultメソッドの実行時に発生します。これを回避する最善の方法は、FormatResultクラスをリファクタリングして、選択したActionResultを実行せずに取得できるようにすることです。プル要求が歓迎されています。

これをテストする唯一の方法は、ExecuteResultメソッドを実行して結果を検査することです。安らかなルーティングこのようなコードの将来のバージョンで