質問

Moqで奇妙な動作が発生しています-モックオブジェクトを設定して特定の方法で動作し、テストしているオブジェクトとまったく同じ方法でメソッドを呼び出すにもかかわらず、あたかも反応しますメソッドは呼び出されませんでした。

テストしようとしている次のコントローラーアクションがあります:

public ActionResult Search(string query, bool includeAll)
{
    if (query != null)
    {
        var keywords = query.Split(' ');
        return View(repo.SearchForContacts(keywords, includeAll));
    }
    else
    {
        return View();
    }
}

ユニットテストコード:

public void SearchTestMethod() // Arrange
    var teststring = "Anders Beata";
    var keywords = teststring.Split(' ');
    var includeAll = false;
    var expectedModel = dummyContacts.Where(c => c.Id == 1 || c.Id == 2);
    repository
        .Expect(r => r.SearchForContacts(keywords, includeAll))
        .Returns(expectedModel)
        .Verifiable();

    // Act
    var result = controller.Search(teststring, includeAll) as ViewResult;

    // Assert
    repository.Verify();
    Assert.IsNotNull(result);
    AssertThat.CollectionsAreEqual<Contact>(
        expectedModel, 
        result.ViewData.Model as IEnumerable<Contact>
    );
}

where AssertThat は、多数のアサーションヘルパーを備えた独自のクラスです( Assert クラスは拡張メソッドで拡張できないため...ため息。 ..)。

テストを実行すると、 repository.Verify()行で MoqVerificationException で失敗します:

Test method MemberDatabase.Tests.Controllers.ContactsControllerTest.SearchTestMethod()
threw exception:  Moq.MockVerificationException: The following expectations were not met:
IRepository r => r.SearchForContacts(value(System.String[]), False)

repository.Verify()を削除すると、返されるモデルが null であることを示すコレクションのアサートに失敗します。 query!= null をデバッグして確認し、コードが実行される if ブロックの一部に取り込まれることを確認しました。問題ありません。

なぜ機能しないのですか

役に立ちましたか?

解決

モックされたリポジトリに渡す配列( teststring.Split( '')の結果)が実際に渡されるオブジェクトと同じオブジェクトではないためだと思いますSearchメソッド( query.Split( '')の結果)。

セットアップコードの最初の行を次のように置き換えてみてください:

repository.Expect(r => r.SearchForContacts(
    It.Is<String[]>(s => s.SequenceEqual(keywords)), includeAll))

...は、モックに渡された配列の各要素を keywords 配列の対応する要素と比較します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top