ASP.NET Core MVC と xUnit.NET でユニットテストを行う Part.0(準備編)

ユニットテストをしましょう

ASP.NET Core MVC では、推奨されるユニットテストフレームワークとしてxUnit.NETが採用されました。
さよならMSTest、いい奴だったよ。

xUnit.NET を準備する

今日は準備だけなので、公式サイトの情報

Getting started with xUnit.net (.NET Core / ASP.NET Core) > xUnit.net

を読めばほとんど同じことが書いてあります。

というか、いろんなサイトを周ったり試行錯誤をした事がたいてい書いてありました。
公式サイトは読むべきですね!!!!

テストプロジェクトを追加する

ユニットテストプロジェクトを追加するのですが、下記のように"test"というソリューションフォルダを作成して、そこにテストプロジェクトを追加する事にしました。

f:id:mrgchr:20161024232050p:plain

ところで、このソリューションフォルダは実フォルダを作成してくれないので、エクスプローラから別途"test"というフォルダを作成した方が良いです。

テストプロジェクトを作成

次にテストプロジェクトを作成します。

ソリューションフォルダ"test"を右クリックして、"Add"->"New Project..."から、作成します。
プロジェクト名は、"[テスト対象名].Test(s)" などが一般的なようです。

この際に、下記のようにLocationの末尾に"\test"を追加するのを忘れないようにしましょう。

f:id:mrgchr:20161024232500p:plain

参照を追加

次に、テストプロジェクトにテスト対象プロジェクトの参照を追加します。

新たに追加した[PracticeWorld1.Test]の[References]を右クリックし、[Add Reference...]->[Projects]->[Solution]より、[PracticeWorld1]を選択し、[OK]を押します。

そうすると、サンプルサイトを利用していた場合は下記のように、「ターゲットフレームワークに互換性がない」旨のエラーが出ます。

f:id:mrgchr:20161024233611p:plain

しょうがないので、テストプロジェクトのターゲットフレームワークを変更します。
テストプロジェクトのproject.jsonの"framework"をテスト対象と同じにします。

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

win8とか言われても意味わからん」と思いますが、堪えて先に進みます。

これにより先ほどエラーになったPracticeWorld1の参照が追加できます。

xUnit.NETを追加

次に下記のように"dependencies"にxunitなどを追加します。
特に"Microsoft.NETCore.App"は、テスト対象プロジェクトでも同じものを参照しているため、バージョンを合わせるようにしてください。
コピーするのが手っ取り早いと思います。

{
  "version": "1.0.0-*",

  "dependencies": {
    "PracticeWorld1": "1.0.0-*",
    "xunit": "2.2.0-beta3-build3402",
    "dotnet-test-xunit": "2.2.0-preview2-build1029",
    "Microsoft.NETCore.App": {
      "type": "platform",
      "version": "1.0.1"
    }
  },
  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "dotnet5.6",
        "portable-net45+win8"
      ]
    }
  }
}

テストを作成し、実行する

テストプロジェクトに新規ファイルを追加し、何かテストを書いてみます。

using Microsoft.AspNetCore.Mvc;
using PracticeWorld1.Controllers;
using Xunit;

namespace PracticeWorld1.Test
{
  public class SomeTest
  {
    [Fact]
    public void Test1()
    {
      Assert.Equal(2, 1 + 1);
    }

    [Fact]
    public void Test2()
    {
      var controller = new HomeController();
      var view = controller.Index() as ViewResult;

      Assert.NotNull(view);
    }
  }
}

VisualStudioの右クリックメニューから"Run Tests"あるいは"Debug Tests"を実行します。

f:id:mrgchr:20161025000131p:plain

テストが実行されました!ブレイクポイントを設定してデバッグもできます。

CUI でテストを実行する

CUIでテストランナーを実行するには、テストプロジェクト直下(project.json ファイルがある場所)にて、

> dotnet test

を実行します。

PracticeWorld1\test\PracticeWorld1.Test> dotnet test
Project PracticeWorld1 (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
Project PracticeWorld1.Test (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
xUnit.net .NET CLI test runner (64-bit .NET Core win10-x64)
  Discovering: PracticeWorld1.Test
  Discovered:  PracticeWorld1.Test
  Starting:    PracticeWorld1.Test
  Finished:    PracticeWorld1.Test
=== TEST EXECUTION SUMMARY ===
   PracticeWorld1.Test  Total: 2, Errors: 0, Failed: 0, Skipped: 0, Time: 0.187s
SUMMARY: Total: 1 targets, Passed: 1, Failed: 0.