Visual Studio for Mac を使用した macOS での完全な .NET Core ソリューションの構築Building a complete .NET Core solution on macOS using Visual Studio for Mac

Visual Studio for Mac では、.NET Core アプリケーション開発用の機能をすべて備えた統合開発環境 (IDE) が提供されます。Visual Studio for Mac provides a full-featured Integrated Development Environment (IDE) for developing .NET Core applications. このトピックでは、再利用可能なライブラリと単体テストを含む .NET Core ソリューションの構築方法を示します。This topic walks you through building a .NET Core solution that includes a reusable library and unit testing.

このチュートリアルでは、ユーザーが入力した検索語とテキスト文字列を受け入れ、クラス ライブラリでメソッドを使用した場合に文字列に検索語が表示される回数をカウントし、ユーザーに結果を返すアプリケーションの作成方法を示します。This tutorial shows you how to create an application that accepts a search word and a string of text from the user, counts the number of times the search word appears in the string using a method in a class library, and returns the result to the user. ソリューションには、単体テストの概念を紹介するため、クラス ライブラリの単体テストも含まれています。The solution also includes unit testing for the class library as an introduction to unit testing concepts. 完全なサンプルでチュートリアルを続行する場合は、サンプル ソリューションをダウンロードしてください。If you prefer to proceed through the tutorial with a complete sample, download the sample solution. ダウンロード方法については、「サンプルおよびチュートリアル」を参照してください。For download instructions, see Samples and Tutorials.

注意

お客様のフィードバックは非常に貴重です。Your feedback is highly valued. 次の 2 つの方法で Visual Studio for Mac の開発チームにフィードバックを送信できます。There are two ways you can provide feedback to the development team on Visual Studio for Mac:

  • Visual Studio for Mac で、メニューから [ヘルプ] > [問題の報告] の順に選択するか、ようこそ画面から [問題の報告] を選択して、バグ報告を提出するためのウィンドウを開きます。In Visual Studio for Mac, select Help > Report a Problem from the menu or Report a Problem from the Welcome screen, which opens a window for filing a bug report. お客様のフィードバックは、開発者コミュニティ ポータルで追跡することができます。You can track your feedback in the Developer Community portal.
  • 提案するには、メニューから [ヘルプ] > [提案の送信] の順に選択するか、ようこそ画面から [提案の送信] を選択し、Visual Studio for Mac の開発者コミュニティの Web ページに移動します。To make a suggestion, select Help > Provide a Suggestion from the menu or Provide a Suggestion from the Welcome screen, which takes you to the Visual Studio for Mac Developer Community webpage.

必須コンポーネントPrerequisites

必須コンポーネントの詳細については、「Mac における .NET Core の前提条件」を参照してください。For more information on prerequisites, see the Prerequisites for .NET Core on Mac. Visual Studio 2017 for Mac の完全なシステム要件については、「Visual Studio 2017 for Mac 製品ファミリのシステム要件」をご覧ください。For the full system requirements of Visual Studio 2017 for Mac, see Visual Studio 2017 for Mac Product Family System Requirements.

ライブラリのビルドBuilding a library

  1. ようこそ画面で、 [新しいプロジェクト] を選択します。On the Welcome screen, select New Project. [新しいプロジェクト] ダイアログで、 [.NET Core] ノードの下にある [.NET Standard ライブラリ] テンプレートを選択します。In the New Project dialog under the .NET Core node, select the .NET Standard Library template. これにより、.NET Core を対象とする .NET Standard ライブラリと、.NET Standard のバージョン 2.0 をサポートするその他の .NET 実装が作成されます。This creates a .NET Standard library that targets .NET Core as well as any other .NET implementation that supports version 2.0 of the .NET Standard. [次へ] を選択します。Select Next.

    Visual Studio for Mac の [新しいプロジェクト] ダイアログ

  2. プロジェクトには "TextUtils" ("Text Utilities" の短い名前)、ソリューションには "WordCounter" という名前を付けます。Name the project "TextUtils" (a short name for "Text Utilities") and the solution "WordCounter". [ソリューション ディレクトリ内にプロジェクト ディレクトリを作成します] チェック ボックスはそのままにしておきます。Leave Create a project directory within the solution directory checked. [作成] を選択します。Select Create.

    Visual Studio for Mac の [新しいプロジェクト] ダイアログのオプション

  3. [ソリューション] サイドバーで、TextUtils ノードを展開し、テンプレートで提供される Class1.cs というクラス ファイルを表示します。In the Solution sidebar, expand the TextUtils node to reveal the class file provided by the template, Class1.cs. ファイルを右クリックし、コンテキスト メニューから [名前の変更] を選択して、ファイル名を WordCount.cs に変更します。Right-click the file, select Rename from the context menu, and rename the file to WordCount.cs. ファイルを開き、内容を次のコードに置き換えます。Open the file and replace the contents with the following code:

    using System;
    using System.Linq;
    
    namespace TextUtils
    {
        public static class WordCount
        {
            public static int GetWordCount(string searchWord, string inputString)
            {
                // Null check these variables and determine if they have values.
                if (string.IsNullOrEmpty(searchWord) || string.IsNullOrEmpty(inputString))
                {
                    return 0;
                }
    
                // Convert the string into an array of words.
                var source = inputString.Split(new char[] { '.', '?', '!', ' ', ';', ':', ',' },
                                               StringSplitOptions.RemoveEmptyEntries);
    
                // Create the query. Use ToLowerInvariant to match uppercase/lowercase strings.   
                var matchQuery = from word in source
                                 where word.ToLowerInvariant() == searchWord.ToLowerInvariant()
                                 select word;
    
                // Count the matches, which executes the query. Return the result.
                return matchQuery.Count();
            }
        }
    }
    
  4. ファイルを保存します。その場合、3 つの異なる方法 (キーボード ショートカット +s キーを使用する、メニューから [ファイル] > [保存] の順に選択する、ファイルのタブを右クリックしてコンテキスト メニューから [保存] を選択する) のいずれかを使用します。Save the file by using any of three different methods: use the keyboard shortcut +s, select File > Save from the menu, or right-click on the file's tab and select Save from the contextual menu. 次のイメージは IDE ウィンドウを示しています。The following image shows the IDE window:

    クラス ライブラリ ファイルとメソッドが示された Visual Studio for Mac IDE ウィンドウ

  5. IDE ウィンドウの下部の余白にある [エラー] を選択して、 [エラー] パネルを開きます。Select Errors in the margin at the bottom of the IDE window to open the Errors panel. [ビルド出力] ボタンを選択します。Select the Build Output button.

    [エラー] ボタンが示された Visual Studio Mac IDE の下余白

  6. メニューから [ビルド] > [すべてビルド] の順に選択します。Select Build > Build All from the menu.

    ソリューションがビルドされます。The solution builds. ビルド出力パネルに、ビルドが成功したことが示されます。The build output panel shows that the build is successful.

    ビルドの成功メッセージが表示された、[エラー] パネルの Visual Studio Mac のビルド出力ウィンドウ

テスト プロジェクトの作成Creating a test project

単体テストでは、開発および公開時に自動化されたソフトウェア テストが提供されます。Unit tests provide automated software testing during your development and publishing. このチュートリアルで使用するテスト フレームワークは xUnit (バージョン 2.2.0 以降) です。これは、以下の手順で xUnit テスト プロジェクトをソリューションに追加したときに自動的にインストールされます。The testing framework that you use in this tutorial is xUnit (version 2.2.0 or later), which is installed automatically when the xUnit test project is added to the solution in the following steps:

  1. [ソリューション] サイドバーで、WordCounter ソリューション名を右クリックし、 [追加] > [新しいプロジェクトの追加] の順に選択します。In the Solution sidebar, right-click the WordCounter solution and select Add > Add New Project.

  2. [新しいプロジェクト] ダイアログで、 [.NET Core] ノードから [テスト] を選択します。In the New Project dialog, select Tests from the .NET Core node. [xUnit Test Project (xUnit テスト プロジェクト)] を選択してから [次へ] を選択します。Select the xUnit Test Project followed by Next.

    xUnit テスト プロジェクトを作成する Visual Studio Mac の [新しいプロジェクト] ダイアログ

  3. 新しいプロジェクトに "TestLibrary" という名前を付けて、 [作成] を選択します。Name the new project "TestLibrary" and select Create.

    プロジェクト名を指定する Visual Studio Mac の [新しいプロジェクト] ダイアログ

  4. テスト ライブラリを WordCount クラスで使用するには、TextUtils プロジェクトへの参照を追加します。In order for the test library to work with the WordCount class, add a reference to the TextUtils project. [ソリューション] サイドバーで、TestLibrary の下にある [依存関係] を右クリックします。In the Solution sidebar, right-click Dependencies under TestLibrary. コンテキスト メニューから [参照の編集] を選択します。Select Edit References from the context menu.

  5. [参照の編集] ダイアログで、 [プロジェクト] タブの [TextUtils] プロジェクトを選択します。 [OK] を選択します。In the Edit References dialog, select the TextUtils project on the Projects tab. Select OK.

    Visual Studio Mac の [参照の編集] ダイアログ

  6. [TestLibrary] プロジェクトで、UnitTest1.cs ファイルの名前を TextUtilsTests.cs に変更します。In the TestLibrary project, rename the UnitTest1.cs file to TextUtilsTests.cs.

  7. ファイルを開き、コードを次のものと置き換えます。Open the file and replace the code with the following:

    using Xunit;
    using TextUtils;
    using System.Diagnostics;
    
    namespace TestLibrary
    {
        public class TextUtils_GetWordCountShould
        {
            [Fact]
            public void IgnoreCasing()
            {
                var wordCount = WordCount.GetWordCount("Jack", "Jack jack");
    
                Assert.NotEqual(2, wordCount);
            }
        }
    }
    

    次のイメージは、単体テスト コードが配置済みの IDE を示しています。The following image shows the IDE with the unit test code in place. Assert.NotEqual ステートメントに注目してください。Pay attention to the Assert.NotEqual statement.

    IDE のメイン ウィンドウでの Visual Studio for Mac の最初の単体テスト

    新しいテストを一度失敗させてテスト ロジックが正しいことを確認することが重要です。It's important to make a new test fail once to confirm its testing logic is correct. メソッドは "Jack" (先頭が大文字) という名前と、"Jack" および "jack" (先頭が大文字のものと小文字のもの) を含む文字列を渡します。The method passes in the name "Jack" (uppercase) and a string with "Jack" and "jack" (uppercase and lowercase). GetWordCount メソッドが正しく機能している場合は、検索語の 2 つのインスタンスのカウントが返されます。If the GetWordCount method is working properly, it returns a count of two instances of the search word. このテストを意図的に失敗させるには、まず、検索語 "Jack" の 2 つのインスタンスが GetWordCount メソッドで返されないことをアサートするテストを実装します。In order to fail this test on purpose, you first implement the test asserting that two instances of the search word "Jack" aren't returned by the GetWordCount method. 次の手順に進んで意図的にテストを失敗させます。Continue to the next step to fail the test on purpose.

  8. 画面の右側の [単体テスト] パネルを開きます。Open the Unit Tests panel on the right side of the screen.

    Visual Studio for Mac の [単体テスト] パネル

  9. [ドッキング] アイコンをクリックして、パネルを開いたままにします。Click the Dock icon to keep the panel open.

    Visual Studio for Mac の [単体テスト] パネルの [ドッキング] アイコン

  10. [すべて実行] ボタンをクリックします。Click the Run All button.

    テストは失敗します。これが正しい結果です。The test fails, which is the correct result. テスト メソッドは、GetWordCount メソッドに指定された文字列 "Jack jack" から inputString "Jack" の 2 つのインスタンスが返されないことをアサートします。The test method asserts that two instances of the inputString, "Jack," aren't returned from the string "Jack jack" provided to the GetWordCount method. 単語の大文字と小文字は GetWordCount メソッドでは考慮されないため、2 つのインスタンスが返されます。Since word casing was factored out in the GetWordCount method, two instances are returned. 2 is not equal to 2 というアサーションは失敗します。The assertion that 2 is not equal to 2 fails. これは正しい結果であり、テストのロジックは適切です。This is the correct outcome, and the logic of our test is good.

    Visual Studio for Mac のテスト エラーの表示

  11. Assert.NotEqual から Assert.Equal に変更して IgnoreCasing テスト メソッドを変更します。Modify the IgnoreCasing test method by changing Assert.NotEqual to Assert.Equal. ファイルを保存します。その場合、キーボード ショートカット +s を使用するか、メニューの [ファイル] > [保存] の順に選択するか、ファイルのタブを右クリックしてコンテキスト メニューから [保存] を選択します。Save the file by using the keyboard shortcut +s, File > Save from the menu, or right-clicking on the file's tab and selecting Save from the context menu.

    searchWord "Jack" は GetWordCount に渡された inputString "Jack jack" を含む 2 つのインスタンスを返すことが予想されます。You expect that the searchWord "Jack" returns two instances with inputString "Jack jack" passed into GetWordCount. [単体テスト] パネルの [テストの実行] ボタン、または画面下部の [テスト結果] パネルの [テストの再実行] ボタンをクリックして、テストを再実行します。Run the test again by clicking the Run Tests button in the Unit Tests panel or the Rerun Tests button in the Test Results panel at the bottom of the screen. テストに合格します。The test passes. 文字列 "Jack jack" (大文字と小文字の区別は無視) に "Jack" のインスタンスが 2 つあり、テスト アサーションは true です。There are two instances of "Jack" in the string "Jack jack" (ignoring casing), and the test assertion is true.

    Visual Studio for Mac のテスト成功の表示

  12. Fact での個々の戻り値のテストは、単体テストで実行できることのほんの一部に過ぎません。Testing individual return values with a Fact is only the beginning of what you can do with unit testing. 別の強力な手法では、Theory を使用して一度に複数の値をテストすることができます。Another powerful technique allows you to test several values at once using a Theory. 次のメソッドを TextUtils_GetWordCountShould クラスに追加します。Add the following method to your TextUtils_GetWordCountShould class. このメソッドを追加すると、クラスのメソッドは 2 つになります。You have two methods in the class after you add this method:

    [Theory]
    [InlineData(0, "Ting", "Does not appear in the string.")]
    [InlineData(1, "Ting", "Ting appears once.")]
    [InlineData(2, "Ting", "Ting appears twice with Ting.")]
    public void CountInstancesCorrectly(int count,
                                        string searchWord,
                                        string inputString)
    {
        Assert.NotEqual(count, WordCount.GetWordCount(searchWord,
                                                   inputString));
    }
    

    CountInstancesCorrectly は、GetWordCount メソッドが正しくカウントすることを確認します。The CountInstancesCorrectly checks that the GetWordCount method counts correctly. InlineData は確認するカウント、検索語、および入力文字列を示します。The InlineData provides a count, a search word, and an input string to check. テスト メソッドはデータの行ごとに一度実行されます。The test method runs once for each line of data. 繰り返しますが、データのカウントが正しく、値が GetWordCount メソッドで返されるカウントと一致することがわかっている場合でも、まず、Assert.NotEqual を使用して失敗をアサートする必要があります。Note once again that you're asserting a failure first by using Assert.NotEqual, even when you know that the counts in the data are correct and that the values match the counts returned by the GetWordCount method. 意図的にテストを失敗させる手順を実行するのは、最初は時間の無駄と思えるかもしれませんが、まず、テストを失敗させてロジックを確認することはテストのロジックを確認するうえで重要なことです。Performing the step of failing the test on purpose might seem like a waste of time at first, but checking the logic of the test by failing it first is an important check on the logic of your tests. 失敗させようとしたのに成功するテスト メソッドがある場合、そのテストのロジックにバグがあります。When you come across a test method that passes when you expect it to fail, you've found a bug in the logic of the test. テスト メソッドを作成するたびに、この手順を実行することをお勧めします。It's worth the effort to take this step every time you create a test method.

  13. ファイルを保存し、もう一度テストを実行します。Save the file and run the tests again. 大文字と小文字のテストは成功しますが、3 つのカウント テストは失敗します。The casing test passes but the three count tests fail. これは予想したとおりの結果です。This is exactly what you expect to happen.

    Visual Studio for Mac の予測されるテスト エラー

  14. Assert.NotEqual から Assert.Equal に変更して CountInstancesCorrectly テスト メソッドを変更します。Modify the CountInstancesCorrectly test method by changing Assert.NotEqual to Assert.Equal. ファイルを保存します。Save the file. テストをもう一度実行します。Run the tests again. すべてのテストに成功します。All tests pass.

    Visual Studio for Mac の予測されるテスト成功

コンソール アプリの追加Adding a console app

  1. [ソリューション] サイドバーで、WordCounter ソリューションを右クリックします。In the Solution sidebar, right-click the WordCounter solution. [.NET Core] > [アプリ] テンプレートの順に移動してテンプレートを選択し、新しいコンソール アプリケーションプロジェクトを追加します。Add a new Console Application project by selecting the template from the .NET Core > App templates. [次へ] を選択します。Select Next. プロジェクトに WordCounterApp という名前を付けます。Name the project WordCounterApp. [作成] を選択し、ソリューションでプロジェクトを作成します。Select Create to create the project in the solution.

  2. [ソリューション] サイドバーで、新しい WordCounterApp プロジェクトの [依存関係] ノードを右クリックします。In the Solutions sidebar, right-click the Dependencies node of the new WordCounterApp project. [参照の編集] ダイアログで、TextUtils にチェック マークを付けて [OK] を選択します。In the Edit References dialog, check TextUtils and select OK.

  3. Program.cs ファイルを開きます。Open the Program.cs file. このコードを次のコードを使って置き換えます。Replace the code with the following:

    using System;
    using TextUtils;
    
    namespace WordCounterApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Enter a search word:");
                var searchWord = Console.ReadLine();
                Console.WriteLine("Provide a string to search:");
                var inputString = Console.ReadLine();
    
                var wordCount = WordCount.GetWordCount(searchWord, inputString);
    
                var pluralChar = "s";
                if (wordCount == 1)
                {
                    pluralChar = string.Empty;
                }
    
                Console.WriteLine($"The search word {searchWord} appears " +
                                  $"{wordCount} time{pluralChar}.");
            }
        }
    }
    
  4. IDE ではなく、コンソール ウィンドウでアプリを実行するには、WordCounterApp プロジェクトを右クリックして [オプション] を選択し、 [構成] の下の [既定] ノードを開きます。To run the app in a console window instead of the IDE, right-click the WordCounterApp project, select Options, and open the Default node under Configurations. [外部コンソールで実行] のチェック ボックスをオンにします。Check the box for Run on external console. [コンソール出力を一時停止する] オプションはオンのままにしておきます。Leave the Pause console output option checked. この設定により、コンソール ウィンドウでアプリが起動し、Console.ReadLine ステートメントに入力できるようになります。This setting causes the app to spawn in a console window so that you can type input for the Console.ReadLine statements. IDE でそのままアプリを実行すると、Console.WriteLine ステートメントの出力が表示されるだけです。If you leave the app to run in the IDE, you can only see the output of Console.WriteLine statements. Console.ReadLine ステートメントは、IDE の [アプリケーション出力] パネルでは機能しません。Console.ReadLine statements do not work in the IDE's Application Output panel.

    Visual Studio for Mac の [プロジェクト オプション] ウィンドウ

  5. Visual Studio for Mac の現在のバージョンでは、ソリューションの実行時にテストを実行できないため、コンソール アプリを直接実行します。Because the current version of Visual Studio for Mac cannot run the tests when the solution is run, you run the console app directly. WordCounterApp プロジェクトを右クリックし、コンテキスト メニューから [Run item (項目の実行)] を選択します。Right-click on the WordCounterApp project and select Run item from the context menu. [再生] ボタンでアプリを実行しようとすると、テスト ランナーとアプリの実行は失敗します。If you attempt to run the app with the Play button, the test runner and app fail to run. この問題への取り組みの状態について詳しくは、xunit/xamarinstudio.xunit (#60) を参照してください。For more information on the status of the work on this issue, see xunit/xamarinstudio.xunit (#60). アプリを実行する際に、コンソール ウィンドウで入力を求めるメッセージが表示されたら、検索語と入力文字列の値を入力します。When you run the app, provide values for the search word and input string at the prompts in the console window. アプリには、文字列での検索語の表示回数が示されます。The app indicates the number of times the search word appears in the string.

    アプリが実行中であることを示す Visual Studio for Mac のコンソール ウィンドウ

  6. 確認する最後の機能は、Visual Studio for Mac でのデバッグです。The last feature to explore is debugging with Visual Studio for Mac. Console.WriteLine ステートメントにブレークポイントを設定します。23 行目の左余白を選択すると、コード行の横に赤い丸が表示されます。Set a breakpoint on the Console.WriteLine statement: Select in the left margin of line 23, and you see a red circle appear next to the line of code. コード行の任意の場所を選択し、メニューから [実行] > [ブレークポイントの設定/解除] の順に選択することもできます。Alternatively, select anywhere on the line of code and select Run > Toggle Breakpoint from the menu.

    Visual Studio for Mac のブレークポイントの設定

  7. WordCounterApp プロジェクトを右クリックします。Right-click the WordCounterApp project. コンテキスト メニューから [Start Debugging item (項目のデバッグの開始)] を選択します。Select Start Debugging item from the context menu. アプリが実行されたら、検索語 "cat" と検索文字列 "The dog chased the cat, but the cat escaped"When the app runs, enter the search word "cat" and "The dog chased the cat, but the cat escaped." を入力します。for the string to search. Console.WriteLine ステートメントに達した時点でプログラムの実行が停止します。その後、ステートメントが実行されます。When the Console.WriteLine statement is reached, program execution halts before the statement is executed. [ローカル] タブで、searchWordinputStringwordCount、および pluralChar の各値を確認できます。In the Locals tab, you can see the searchWord, inputString, wordCount, and pluralChar values.

    Visual Studio for Mac の停止されたデバッガー プログラムの実行

  8. [イミディエイト] ウィンドウで、「wordCount = 999;」と入力してから Enter キーを押します。In the Immediate pane, type "wordCount = 999;" and press Enter. これで、wordCount 変数に 999 という意味のない値が割り当てられます。これは、デバッグ中に変数値の置き換えが可能であることを示します。This assigns a nonsense value of 999 to the wordCount variable showing that you can replace variable values while debugging.

    Visual Studio for Mac の [イミディエイト] ウィンドウで値を変更する

  9. ツールバーで、続行矢印をクリックします。In the toolbar, click the continue arrow. コンソール ウィンドウの出力を確認します。Look at the output in the console window. アプリのデバッグ時に設定した 999 という不適切な値が報告されます。It reports the incorrect value of 999 that you set when you were debugging the app.

    Visual Studio for Mac ツールバーの続行ボタン

    Visual Studio for Mac のコンソール ウィンドウの出力

関連項目See also