2009-08-02 2 views
3

モックで何らかの奇妙な動作が発生しています。モックオブジェクトを設定して特定の方法で動作させてから、私がテストしているオブジェクトと同じ方法で、メソッドが呼び出されなかったかのように反応します。モックオブジェクトへの期待が満たされていないようです(Moq)

I持って、私はテストをしようとしている以下のコントローラのアクション:

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

私のユニットテストコード:AssertThatはの束と自分だけのクラスです

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> 
    ); 
} 

アサーションヘルパー(Assertクラスは拡張メソッド... sigh ...で拡張できません)。

私がテストを実行すると、それはMoqVerificationExceptionで、repository.Verify()行に失敗した:私はrepository.Verify()を削除した場合

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)

、コレクションのアサートが返されたモデルがnullであることを私に言って失敗しました。私はデバッグして、query != nullをチェックしました。コードが実行されているブロックifの部分に取り込まれています。そこに問題はありません。

なぜこれは機能しませんか?

答えて

6

あなたが模擬リポジトリに渡す配列(teststring.Split(' ')の結果)は、実際に検索メソッドから渡されたオブジェクトと同じオブジェクトではないと思われます(結果はquery.Split(' ')です)。 keywords配列の対応する要素を使用して、モックに渡された配列の各要素を比較します

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

...:

はとセットアップのコードの最初の行を交換してみてください。

+0

ありがとう!それは即刻トリックでした! =)私はMoqを読む必要があると思われます。具体的には、いつどのようにIt ...構造を使用するかについてです。 –

関連する問題