0

アクションの最初の行は、追加の統合テストでテストされます。2 行目は、オートマッパー マッピング用の追加の単体テストでテストされています。3 行目はテストされていません。

以下の単体テストは 3 行目をテストしますか? 戻り値の型をテストするだけだからです。

これはばかげているか、あまりにも些細なことに思えます。メソッドは他に何を返す必要がありますか????

このアクション内に if/else ロジックはありません。したがって、 type == JsonNetResult をテストするだけでも、私にとっては超流動的なように思えます。誰かが success = true 匿名型を削除しても、単体テストではわかりません。

JsonNetResult のデータを QUnit でテストする必要がありますか?

Jsonデータを返すアクションは私を夢中にさせるので、いくつかのガイダンスとヒントをいただければ幸いです... dbからデータをフェッチし、JsonNetResultオブジェクト内に配置するだけです。

アクション

[HttpGet]
public ActionResult GetTemplateRootUnits(int templateId)
{
    IEnumerable<Unit> units = _dataProvider.GetTemplateRootUnits(templateId);
    IEnumerable<UnitTreeViewModel> unitTreeViewModels = Mapper.Map<IEnumerable<Unit>, IEnumerable<UnitTreeViewModel>>(units);
    return new JsonNetResult(new { data = unitTreeViewModels, success = true });
}

単体テスト

[Test]
public void GetTemplateRootUnits_TemplateExists_ReturnsJsonNetResult()
{
    // ARRANGE  
    Mock<IUnitDataProvider> mock1 = new Mock<IUnitDataProvider>();
    Mock<IMappingEngine> mock2 = new Mock<IMappingEngine>();
    Mock<ControllerContext> mock3 = new Mock<ControllerContext>();
    UnitController controller = new UnitController(mock1.Object, mock2.Object);
    mock1.Setup(m => m.GetTemplateRootUnits(1)).Returns(new List<Unit> 
    { 
        new Unit{ UnitId = 1, Name = "Name1", HasChildren = false},
        new Unit{ UnitId = 2, Name = "Name2", HasChildren = false},
        new Unit{ UnitId = 3, Name = "Name3", HasChildren = false},
    });

    var unitTreeViewModels = new List<UnitTreeViewModel> 
    { 
        new UnitTreeViewModel { Id = 1, Name = "Name1", HasChildren = false},
        new UnitTreeViewModel { Id = 2, Name = "Name2", HasChildren = false},
        new UnitTreeViewModel { Id = 3, Name = "Name3", HasChildren = false},
    };

    // Thats the way AutoMapper is mocked
    mock2.Setup(m => m.Map<IEnumerable<Unit>, IEnumerable<UnitTreeViewModel>>(It.IsAny<IEnumerable<Unit>>())).Returns(unitTreeViewModels);

    // ACT
    ActionResult result = controller.GetTemplateRootUnits(1);

    // ASSERT - check that the dataProvider.GetTestplanRootUnits() was called
    mock1.Verify(m => m.GetTemplateRootUnits(1));

    // ASSERT
    Assert.IsInstanceOfType(typeof(JsonNetResult), result);
} 

JsonNetResult.cs

public class JsonNetResult : ContentResult
    {
        private readonly object _data;
        public JsonNetResult(object data)
        {
            _data = data;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            Content = JsonConvert.SerializeObject(_data);
            ContentType = "application/json";
            base.ExecuteResult(context);
        }
        public object Data { get { return _data; } }
    }
4

2 に答える 2

0

クラスが何であるかは示されていませんJsonNetResultが、デフォルトの JavaScriptSerializer の代わりに JSON.NET をシリアライザーとして使用するカスタム アクションの結果であると仮定します。Dataまた、このクラスは、シリアル化されるモデルを保持するというオブジェクト型のパブリック プロパティを公開すると仮定します。

public class JsonNetResult: ActionResult
{
    public JsonNetResult(object data)
    {
        Data = data;
    }
    public object Data { get; private set; }

    ...
}

したがって、結果内のデータをテストできます。

// ASSERT
Assert.IsInstanceOfType(typeof(JsonNetResult), result);

var jsonResult = result as JsonNetResult;
var data = new RouteValueDictionary(jsonResult.Data);
Assert.IsTrue((bool)data["success"]);
Assert.IsInstanceOfType(data["data"], typeof(IEnumerable<UnitTreeViewModel>));
Assert.AreEqual(unitTreeViewModels, data["data"]);
于 2012-09-10T07:06:25.370 に答える
0

戻り値の型をテストする必要はありません。メソッドのシグネチャに戻り値の型を設定する必要があります。

public JsonNetResult GetTemplateRootUnits(int templateId);
于 2012-09-09T20:59:37.997 に答える