C# xUnit

こういうのって実際のやつで試してみた方がいいんだろうけどとりあえず簡単なまとめ。
今回macでやっているのでxUnitを使っていきます。

まずはコンソールアプリのプロジェクトを作る。
<img width="1552" alt="スクリーンショット 2019-12-14 0.20.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/4e4116dd-a202-46f7-a158-ad07384f9f39.png">

次にソリューションから追加で新しいプロジェクトを追加でxUnitを追加する。

<img width="1552" alt="スクリーンショット 2019-12-14 0.25.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/5882d6ca-10d6-a52a-d702-0c476f822a45.png">

テストコード

```UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.True(true);
        }
    }
}
```

実行は右にある単体テストのところから行う。

<img width="1552" alt="スクリーンショット 2019-12-15 0.01.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/baceafb7-ce9d-6d4f-2893-4f601d6bbbee.png">

###DisplayName

[Fact]にDisplayNameを加えると下の実行の所にDisplayNameが出てくる。

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact(DisplayName = "サンプルテスト")]
        public void Test1()
        {
            Assert.True(true);
        }
    }
}
```

実行結果 左下のところにDisplayNameで設定したものが出ている。

<img width="1552" alt="スクリーンショット 2019-12-15 1.07.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/514262/90a37bbf-6c0c-6b76-770e-c060c9482e58.png">

###Skip

[Fact]にSkipを加えるとそのテストはSkipされる。

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact(DisplayName = "サンプルテスト")]
        public void Test1()
        {
            Assert.True(true);
        }

        [Fact(Skip = "無視する")]
        public void Test2()
        {
            Assert.True(true);
        }
    }
}
```

###Timeout

[Fact]にTimeoutを設定してあげると時間の上限を定めることができる。

```cs:UnitTest1.cs
using System.Threading.Tasks;
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact(DisplayName = "サンプルテスト")]
        public void Test1()
        {
            Assert.True(true);
        }

        [Fact(Timeout = 3000)]
        public async Task Test2()
        {
            await Task.Delay(4000);
            Assert.True(true);
        }
    }
}
```

###Theory

メソッド一つで複数回の実行も可能
下記例であれば、aに1,0,-1がそれぞれ代入され実行される。

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Theory]
        [InlineData(1)]
        [InlineData(0)]
        [InlineData(-1)]
        public void Test1(int a)
        {
            Assert.InRange(a, -2, 2);
        }
    }
}
```


##以下Assertの使い方。

分からないものが結構あったので学んでいきたいところ...
最初のTrueだとか以外はABCの順番でやっていったので
後で同系統のものをまとめたい。

###tureであるかどうか

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.True(true);
        }
    }
}
```

###falseかどうか

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.False(false);
        }
    }
}
```

###Listが空かどうか

```cs:UnitTest1.cs
using System.Collections.Generic;
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.Empty(new List<string>());
        }
    }
}
```

###文字列の後ろにxxxが含まれているかどうか

引数1がxxxで引数2が対象の文字列

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.EndsWith("es", "studies");
        }
    }
}
```

###AとBが同じかどうか

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.Equal("aaa", "aaa");
        }
    }
}
```

###範囲に入っているかどうか

第一引数が実際のやつ
第二引数が下限
第三引数が上限

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.InRange(3, 1, 4);
        }
    }
}
```

文字列もできるが使い道はないか。
下の例だとb,c,d,eが範囲となる

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.InRange("c", "b", "e");
        }
    }
}
```

###型の一致確認


```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            int a = 22;
            Assert.IsType(a.GetType(), 32);
        }
    }
}
```

###型の不一致の確認

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            string a = "a";
            Assert.IsNotType(a.GetType(), 32);
        }
    }
}
```

###正規表現とマッチしているかどうか

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.Matches("[a-z]", "a");
        }
    }
}
```

###リストが空ではないかどうか

```cs:UnitTest1.cs
using System.Collections.Generic;
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.NotEmpty(new List<string>{ "apple"});
        }
    }
}
```

###AとBが同じではないかどうか

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.NotEqual("aaa", "bbb");
        }
    }
}
```

###範囲に入っていないかどうか

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.NotInRange(5, 1, 4);
        }
    }
}
```

###Nullではないかどうか

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            int a = 1;
            Assert.NotNull(a);
        }
    }
}
```

###同じではないかどうか

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.NotSame("a", "b");
        }
    }
}
```

###Nullかどうか

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.Null(null);
        }
    }
}
```

###同じかどうか

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.Same("aaa", "aaa");
        }
    }
}
```

###要素が一つかどうか

```cs:UnitTest1.cs
using System.Collections.Generic;
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.Single(new List<int> {1});
        }
    }
}
```

###最初の文字がxxxで始まるかどうか

```cs:UnitTest1.cs
using Xunit;

namespace unit_sample
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            Assert.StartsWith("red", "redmine");
        }
    }
}
```