単体テスト(C# WPF)

C#

記事一覧

MsTest

Assert

Assert.AreEqual(expected, actual, message)

AssertEx.DoesNotThrow(() => this.TestMethod());

AssertEx.Throws<ArgumentNullException>(() => this.TestItemCount());

DataSource

DataRow

DynamicData

Enum等の値によって処理が異なる場合、DynamicDataを使って引数に要素を渡すことにより、対象のパターンを網羅してテストが行える。


[TestMethod]
[DynamicData(nameof(GetHogeState), DynamicDataSourceType.Method)]
public void MethodUpdateTotalStudyCountNormalTest(HogeState hogeState)
{
    switch (hogeState)
    {
        case hogeState.Initialized:
        case hogeState.Started:
            totalCount.Is(1);
            break;
        default:
            totalCount.Is(1);
            break;
    }
}


private static IEnumerable<object[]> GetHogeState()
{
    return DynamicDataProvider.GetValues<HogeState>();
}

Moq

SetUp

DbSetがSetUpできない

何も考えずにDbContextのDbSetをSetUpしようとするとコンパイルが通らない。
理由はDbSetがOverrideできないからで、MockでDbSetを使うには public virtual DbSet<T>が必要になる。

Moqを使ってEntityframeworkのモックを作成するには?【単体テスト】 - Qiita
C#の単体テスト用モックフレームワークといえば、Moqがデフォルトですが、Entityframeworkとの相性があまり...

Where内の条件式のMock用の書き方が分からない

It.IsAny()で抽象化する。

Items.Count(x => x.Name == "hoge");
dbContextMock.Setup(x => x.Items.Count(It.IsAny<Func<TestEntity, bool>>())).Returns(1);

Mockのプロパティを利用可能にする

testMock.SetupProperty(x => x.TestProperty, "hoge")

//すべてのプロパティを利用する場合
testMock.SetupAllProperties();
public Class Test1
{
    public string TestProperty { get; set; }
}

public Class Test2
{
    private Test1 test1;

    public Test2
    {
        this.test1 = new Test1();
    }

    public void TestMethod
    {
        this.TestProperty = "fuga";
    }
}

var Test1Mock = new Mock<Test1>();
var Test2 = new Test2();
testMock.SetupProperty(x => x.TestProperty, "hoge")
AssertEx.DoesNotThrow(() => .TestMethod());

testMock.Object.TestProperty.Is("fuga")

コメント