2011-01-06 6 views
8

ASP.NET MVC2アプリケーションのアクションメソッドはJsonResultオブジェクトを返します。ユニットテストでは、返されたJSONオブジェクトに実際に期待値が含まれていることを確認したいと思います。"dynamic"キーワードとJSONデータ

私はこの試みた:

1. dynamic json = ((JsonResult)myActionResult).Data; 
2. Assert.AreEqual(JsonMessagesHelper.ErrorLevel.ERROR.ToString(), json.ErrorLevel); 

をしかし、私はRuntimeBinderException「『オブジェクト』が 『エラーレベル』の定義が含まれていません」を取得。

私は(下の写真参照)2行目にブレークポイントを配置し、JSON動的変数を検査する場合しかし、それは明らかには、エラーレベルの文字列が含まれず、それが期待値を持っているので、実行時のバインダーがなかった場合テストが合格するという面白い演奏。

Snapshot of the Locals debugger window

私は何を得ていないのですか?私は間違って何をしていますか?これをどのように修正できますか?アサーションをパスするにはどうしたらいいですか?

答えて

15

あなたは本当に動的である必要はありません。ここに例があります。

public ActionResult Index() 
{ 
    return Json(new { Id = 5, Foo = "bar" }); 
} 

と対応するテスト:

// act 
var actual = subjectUnderTest.Index(); 

// assert 
var data = new RouteValueDictionary(actual.Data); 
Assert.AreEqual(5, data["Id"]); 
Assert.AreEqual("bar", data["Foo"]); 

また、あなたがfollowing blog postが有用見つけるかもしれないあなたはユニットテストをしたいと思い、次のアクションを持っていたとします。

+3

※※動作しています。そして、私はそれがどのように機能するのか気に入っていますが、まだかなりハックのようです。匿名オブジェクトの内容を照会するのにRouteValueDictionaryを使用するのは非常に直感的です...私は自分でこれを思いついたとは思わないので、この解決策を覚えておきたいと思います。匿名のオブジェクト(System.Web.dllに隠されていないもの)で同じトリックを行う別のクラスはありませんか? (これはSystem.Web.Routing名前空間に存在しますが、System.Web.Routing.dllには存在しません) –

2

JsonResultDataプロパティはObjectタイプです。つまり、動的宣言がありますが、設定されているタイプはまだObjectです。もう1つの問題は、匿名型をDataとして使用していて、適用可能なスコープ外の宣言されたインスタンスとしてアクセスしようとしていることです。 RouteValueDictionaryを使用してプロパティ値にアクセスするために、@ Darinの技術を使用します。

関連する問題