7

IEnumerableをパラメーターとして受け取るAddメソッドを持つリポジトリがあります。

public void Add<T>(T item) where T : class, new(){}

単体テストで、このメソッドが別のIEnumerableとまったく同じ量の要素を含むIEnumerableで呼び出されていることを確認したいと思います。

[Test]
public void InvoicesAreGeneratedForAllStudents()
{
    var students = StudentStub.GetStudents();
    session.Setup(x => x.All<Student>()).Returns(students.AsQueryable());

    service.GenerateInvoices(Payments.Jaar, DateTime.Now); 

    session.Verify(x => x.Add(It.Is<IEnumerable<Invoice>>(
        invoices => invoices.Count() == students.Count())));
 }

単体テストの結果:

Moq.MockException : 
Expected invocation on the mock at least once, but was never performed: 

x => x.Add<Invoice>(It.Is<IEnumerable`1>(i => i.Count<Invoice>() == 10))

No setups configured.

私は何が間違っているのですか?

4

1 に答える 1

4

コード例から、x=>xを設定していません。Moqに追加します。

session.Setup(x => x.Add(It.IsAny<IEnumerable>());

x.Allのセットアップがx.Addであることが意図されていない限り?その場合は、検証とセットアップを正確に一致させる必要があります。これを行うための良い方法は、式を返す一般的なメソッドに抽出することです。

編集:サンプルを追加しました。コレクションを渡す方法がわからないため、追加の署名を変更しました。

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        Mock<Boo> moqBoo = new Mock<Boo>();
        moqBoo.Setup(IEnumerableHasExpectedNumberOfElements(10));

        // ACT

        moqBoo.Verify(IEnumerableHasExpectedNumberOfElements(10));
    }

    private static Expression<Action<Boo>> IEnumerableHasExpectedNumberOfElements(int expectedNumberOfElements)
    {
        return b => b.Add(It.Is<IEnumerable<Invoice>>(ie => ie.Count() == expectedNumberOfElements));
    }
}

public class Boo
{
    public void Add<T>(IEnumerable<T> item) where T : class, new()
    {
    }
}

public class Invoice
{

}

また、これらをデバッグする良い方法は、MockBehavior.Strictを使用してMockを設定することです。そうすると、呼び出されたコードから、構成する必要があるものが通知されます。

于 2011-06-02T14:20:31.180 に答える