38

JsonResult を返すコントローラーの 1 つでメソッドを単体テストしようとしていました。驚いたことに、次のコードは機能しませんでした。

[HttpPost]
public JsonResult Test() {
    return Json(new {Id = 123});
}

これは私がそれをテストする方法です(テストコードが別のアセンブリにあることにも注意してください):

// Act
dynamic jsonResult = testController.Test().Data;

// Assert
Assert.AreEqual(123, jsonResult.Id);

Assert例外をスローします。

「オブジェクト」には「ID」の定義が含まれていません

それ以来、次を使用して解決しました。

[HttpPost]
public JsonResult Test() {
   dynamic data = new ExpandoObject();
   data.Id = 123;
   return Json(data);
}

最初のものが機能しない理由を理解しようとしていますか? また、基本的に匿名型以外のすべてで動作しているようです。

4

3 に答える 3

14

ここで回答を読み、さらに遠くを見てみると、2009 年の msdn のブログ記事で別のアプローチが再び使用されていることがわかりました。しかし..コメントには、 Kieranによる非常にシンプルで非常にエレガントなソリューションがありました...使用する.ToString().

あなたの元のケースでは:

[HttpPost]
public JsonResult Test()
{
    return Json(new {Id = 123});
}

次のようにしてテストできます。

var jsonResult = controller.Test();
Assert.AreEqual("{Id = 123}", jsonResult.Data.ToString());

私はこのソリューションを非常に好みます:

  • 元のコードの変更を回避 ( InternalsVisibleToExpandoObject)、
  • MvcContribRhinoMocksの使用を回避します (これらのいずれにも問題はありませんが、テストできるようにするためだけに追加する必要はありJsonResultません)。
  • リフレクションの使用を回避します (テストが複雑になります)。
于 2014-02-11T11:25:57.787 に答える
5

匿名型は内部的なものであるため、テストを含む別のライブラリに公開することはできません。コントローラと同じライブラリにテスト コードを配置すると、動作します。

于 2013-06-01T19:49:44.637 に答える