web-dev-qa-db-ja.com

ASP.NET Coreコントローラーまたはモデルオブジェクトを単体テストするにはどうすればよいですか?

ASP.NET Core MVC(プレビュー中のASP.NET 5、現在はASP.Net Coreと呼ばれる)アプリを使用して、Visual Studio 2015で単体テストの下でコントローラー、モデル、リポジトリ(データアクセス)C#クラスを取得しようとしています。

私は次の構造を持っています:

   Solution
       |
      src
       | 
       |-- ITConsole       <- main app (ASP.NET MVC, DNX 4.5.1)
       | 
       `-- ITConsoleTests  <- What kind of project should this be?

MainAppはDNX 4.5.1を使用していますが、標準のnUnitユニットテストアプリを作成すると、.NET Framework 4.5.2をターゲットとするWebクラスライブラリとしてではなく、従来の.NET Frameworkクラスライブラリとしてのみ利用できるようですメインアプリで動作します。

そのため、古典的な.NETフレームワークMicrosoft Unit Testフレームワークプロジェクト(.netアセンブリ)として機能する可能性がある場合に備えて、手動で参照を検索および追加し(参照を追加して参照する)、. NETの依存関係を解決しようとしました。 .NETアセンブリ参照は悲しいことに非推移的であることを認識しています。そのため、UnitTest.dllにMainApp.dllへの参照があり、MainApp.dllがASP.NET MVCに依存し、それが依存する他のすべての要素がある場合、自分でそれを行う必要があります。それが私がやろうとしていることです。ユニットテストプロジェクトにC:\dev\Demo\ITConsole\artifacts\bin\ITConsole\Debug\dnx451\ITConsole.dllへの参照を追加して、コードのコンパイルを開始できるようにしました。単体テストクラスはコンパイルされますが、実行されません。おそらく、ASP.NETへの参照を追加しようとする混乱のためです。

現在、Common.Logging.CoreおよびCommon.Loggingへの参照を追加しましたが、テストエクスプローラーで[すべて実行]をクリックすると、次のエラーが表示されます。

Test Name:  TestStudyLogReadDocument
Test FullName:  ITConsoleTests.ITConsoleTestStudyLog.TestStudyLogReadDocument
Test Source:    C:\dev\Demo\ITConsole\ITConsoleTests\ITConsoleTestStudyLog.cs : line 52
Test Outcome:   Failed
Test Duration:  0:00:00.0712058

Result StackTrace:  
at Couchbase.Configuration.Client.ClientConfiguration..ctor()
   at ITConsole.Repository.StudyLogRepository..ctor() in C:\dev\Demo\ITConsole\src\ITConsole\Repository\StudyLogRepository.cs:line 39
   at ITConsoleTests.ITConsoleTestStudyLog.SetupDb() in C:\dev\Demo\ITConsole\ITConsoleTests\ITConsoleTestStudyLog.cs:line 30
   at ITConsoleTests.ITConsoleTestStudyLog.TestStudyLogReadDocument() in C:\dev\Demo\ITConsole\ITConsoleTests\ITConsoleTestStudyLog.cs:line 53
Result Message: 
Test method ITConsoleTests.ITConsoleTestStudyLog.TestStudyLogReadDocument threw exception: 
System.IO.FileLoadException: Could not load file or Assembly 'Common.Logging.Core, Version=3.1.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e' or one of its dependencies. The located Assembly's manifest definition does not match the Assembly reference. (Exception from HRESULT: 0x80131040)

(この質問が行われた時点で...)asp.net 5 mvcプレビューテンプレートはどれも単体テストを生成できません。光沢のある新しいASP.NET Coreアプリケーションの単体テストさえできますか?以下のスクリーンショットを参照してください。たとえば、MSTESTを使用したVS 2015では、単体テストを開始する通常の方法がどのように利用できないかについて説明しています。

no unit test for you

20
Warren P

更新:XUnitは依然として素晴らしいアイデアですが、 ASP.NETコアで必要な場合は "標準" MSTESTも使用できます できるため、この答えは今では時代遅れです。 (2016年6月1日)私はまだXUnitを好んでいますが、それはあなたの呼び出しです。

最近のXUNITインストラクションリンク: この回答よりも頻繁に更新される可能性のある優れたインストラクションは、xUnit wikiにあります。

IDE回避策:手動で検索して削除する%TEMP%\VisualStudioTestExplorerExtensions Visual Studioがバカになり、テストを「検出」せず、表示しない場合。

2016年5月現在、ASP.NET Core 1.0 RC1が最近RC2に置き換わったため、ASP.NET Core(以前のASP.NET 5)で標準のMicrosoft Unit Testフレームワークを使用することはまだ不可能であり、XUnitはRC1およびRC2に適しています。

XUnit.netユニットテストをASP.NET Core 1.0.0-RC1で動作するように取得するには、公式の指示] 2 を使用して、特定の「.netコアの開始」ケースがあるXUnit githubプロジェクトを使用します。 。

XUnit New Project Templateをインストールすることもできます。これは、通常の完全な.netおよび.netコアのテンプレート化された単体テストプロジェクトを提供します。 [ツール]をクリックし、[拡張機能と更新プログラム]でXUnitと入力し、xUnit Test Project TEMPLATEを見つけて、TEMPLATEをインストールします。 xUNITテストランナーをインストールしないでください。必要ありません。

実用的なサンプルを作成し、bitbucketにアップロードしました。

https://bitbucket.org/wpostma/aspnet5mvc6xunitdemo

Mercurialがない場合は、bitbucketからZipをダウンロードできます。

デモには、合格する1つのテストと失敗する1つのテストが含まれます。

クイックサマリー:

  1. Update2および「1.0.0プレビュー」ツールを含むVisual Studio 2015があります(2016年5月現在)。

  2. 単体テストプロジェクトではなく、Webクラスライブラリを作成します。

  3. XUnit参照を追加し、project.jsonを修正します(下の例)。

  4. クラスを作成します(下の例を参照)。

  5. Ide内またはideの外でTest Explorerを使用してテストを実行し、dnx . testsおよび出力を調べます(以下の例)。

1.0.0-rc2のproject.jsonとデモアセンブリおよびxunitの参照:

 {
  "version": "1.0.0-*",

  "testRunner": "xunit",

  "dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0-rc2-3002702",
      "type": "platform"
    },

    "dotnet-test-xunit": "1.0.0-rc2-*",

    "xunit": "2.1.0",


    "YetAnotherWebbyDemo": "1.0.0-*"
  },

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

単体テストクラス(whatever.cs):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

using Xunit;

using YetAnotherWebbyDemo.Models;

namespace YetAnotherWebbyDemoTests
{
    // This project can output the Class library as a NuGet Package.
    // To enable this option, right-click on the project and select the Properties menu item. In the Build tab select "Produce outputs on build".
    public class TestBasics
    {
        [Fact]
        public void TestAdd()
        {

            TestableModelClass TestMe = new TestableModelClass();


            Assert.True(TestMe.Add(3, 2) == 5, "Basic Math Failure");

            Assert.True(TestMe.Add(-3, -2) == -5, "Basic Math Failure");
        }

    }
}

Dnxを使用したときのRC1のコマンドラインからの出力例:

C:\dev\Demo\YetAnotherWebbyDemo\src\YetAnotherWebbyDemoTests>dnx . test

xUnit.net DNX Runner (32-bit DNX 4.5.1)
  Discovering: YetAnotherWebbyDemoTests
  Discovered:  YetAnotherWebbyDemoTests
  Starting:    YetAnotherWebbyDemoTests
    YetAnotherWebbyDemoTests.TestBasics.TestAdd [FAIL]
      Basic Math Failure
      Expected: True
      Actual:   False
      Stack Trace:
        YetAnotherWebbyDemoTestBasics.cs(25,0): at YetAnotherWebbyDemoTests.Test
Basics.TestAdd()
  Finished:    YetAnotherWebbyDemoTests
=== TEST EXECUTION SUMMARY ===
   YetAnotherWebbyDemoTests  Total: 1, Errors: 0, Failed: 1, Skipped: 0, Time: 0.263s

dotnetを使用しているRC2の出力例:

D:\dev\aspnet5mvc6xunitdemo\src\YetAnotherWebbyDemoTests>dotnet test
Project YetAnotherWebbyDemo (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
Project YetAnotherWebbyDemoTests (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
xUnit.net .NET CLI test runner (64-bit win10-x64)
  Discovering: YetAnotherWebbyDemoTests
  Discovered:  YetAnotherWebbyDemoTests
  Starting:    YetAnotherWebbyDemoTests
    YetAnotherWebbyDemoTests.TestBasics.TestAdd [FAIL]
      Basic Math Failure
      Expected: True
      Actual:   False
      Stack Trace:
        D:\dev\aspnet5mvc6xunitdemo\src\YetAnotherWebbyDemoTests\YetAnotherWebbyDemoTestBasics.cs(26,0): at YetAnotherWebbyDemoTests.TestBasics.TestAdd()
  Finished:    YetAnotherWebbyDemoTests
=== TEST EXECUTION SUMMARY ===
   YetAnotherWebbyDemoTests  Total: 1, Errors: 0, Failed: 1, Skipped: 0, Time: 0.205s
SUMMARY: Total: 1 targets, Passed: 0, Failed: 1.
15
Warren P

XUnitチームは、ドキュメントを更新する素晴らしい仕事をしています。

常に情報を更新するには、次のXunitドキュメントを参照してください。

http://xunit.github.io/docs/getting-started-dotnet-core.html

2
Rafael Miceli