Unit Test ASP.NET Core Web Application with MSTest Framework

接續上篇 Hello ASP.NET 1.0,已可以順利建立與運行 ASP.NET Core Web Application ( .NET Core )。

而依據目前尚有不少東西處於剛釋出 or 正在開發的情況下,若想要跟往常一樣,將專案加入單元測試,是否可行呢 ?

以下就是自己的嘗試筆記。

前言

若前往 ASP.NET Core MVC GitHub 查閱相關 Test Code,會發現採用 xUnit.net 元件。而自己較為熟悉的 Test Framework 是 MSTest。

上個月底的 MSDN Blog 看到一篇文章:Announcing MSTest Framework support for .NET Core RC2 / ASP.NET Core RC2

介紹 .NET Core RC2 階段 MSTest 開發與支援的內容。而 .NET Core RTM 後,目前 MSTest 尚為 Preview 階段,依然值得一試,故來確認其可行性。

實作

首先依據 MSDN Blog 文章上提到 MSTest 於 .NET Core 的 Framework,可至 NuGet-MSTestFramework 查閱:

Install-Package MSTest.TestFramework -Pre
Install-Package dotnet-test-mstest -Pre
請注意:目前該套件為 Preview 階段,若要透過 NuGet GUI 操作下載,請勾選「搶鮮版」

在測試專案中加入上述兩套件即可。相關操作如下:

接續前一篇所建立的專案:DotNetCoreWebApp ( WebApplication ) 並新增專案 DotNetCoreWebApp.Test ( Class Library ),如下圖:

DotNetCoreWebApp:如同前一篇介紹,因相關配置 ( project.json ) 都無異動,保持原始專案結構,就不多介紹。

DotNetCoreWebApp.Test:因目前無採 .NET Core 的測試專案範本,故使用 Class Library 的專案為基底。

測試專案配置如下:

{
  "version": "1.0.0-*",

  "testRunner": "mstest",

  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0",
      "type": "platform"
    },
    "MSTest.TestFramework": "1.0.0-preview",
    "dotnet-test-mstest": "1.0.1-preview",
    "DotNetCoreWebApp": "1.0.0-*"
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dnxcore50",
        "portable-net45+win8"
      ]
    }
  }
}

回到 DotNetCoreWebApp HomeController,新增 GetData Action,直接回傳 "Test" Json 字串。

using Microsoft.AspNetCore.Mvc;

namespace DotNetCoreWebApp.Controllers
{
    public class HomeController : Controller
    {
        //// 省略

        public IActionResult GetData()
        {
            var result = "Test";

            return Json(result);
        }
    }
}

而測試專案新增 HomeControllerTest,撰寫方式與往常相同,並無差別:

using DotNetCoreWebApp.Controllers;
using Microsoft.AspNetCore.Mvc;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace DotNetCoreWebApp.Test
{
    [TestClass]
    public class HomeControllerTest
    {
        [TestMethod]
        public void Verify_Home_GetData_JsonResult_Equal_Test_String()
        {
            //// Arrage
            var homeController = new HomeController();

            var expected = "Test";

            //// Act
            var actual = homeController.GetData() as JsonResult;

            //// Assert
            Assert.IsNotNull(actual);
            Assert.AreEqual(expected, actual.Value);
        }
    }
}

執行測試通過:

執行測試失敗:

以上,為自己嚐鮮的一篇記錄。

資源

MSDN Blog - Announcing MSTest Framework support for .NET Core RC2 / ASP.NET Core RC2
NuGet - MSTest.TestFramework
NuGet - dotnet-test-mstest
Unit test ASP.NET Core Applications with MSTest