3

単体テストの書き方を学んでいて、モックの使用に少し固執しています。私はモッキングに Moq を使用しています。私は VS 2012 に付属している組み込みのテスト フレームワークを使用しています。NUnit の方が優れている場合 (そして問題が解決する場合) に切り替えることができます。作業単位パターンのセットアップがあります。私がテストしている方法は、ユーザーのパスワードをリセットするためのものです。テスト中のメソッドで呼び出される一意のコードに基づいてユーザーのリストを返すように Moq に指示しています。

var mock = new Mock<IUnitOfWork>();
        mock.Setup(u => u.UserRepository.Get(t => t.PassResetCode.Equals("test1"), null, "")).Returns(
            new List<User>
        {
            new User { UserId = 4, FirstName = "Test4", LastName = "LastName", Email = "test4@test.com", Salt = salt, Password = pass, AccountConfirmed = true, PassResetCode = "test1", PassResetExpire = new Nullable<DateTime>(DateTime.Now.Add(ts)) },                
        });

私がテストしているメソッドでは、次のように呼び出します。

var users = unitOfWork.UserRepository.Get(u => u.PassResetCode.Equals(code));

私が知る限り、ここのテストで作成しているユーザーのリストは返されません。Unit of work クラス内にあるリポジトリもモックする必要がありますか? それとも、作業単位インターフェースをモックするだけで十分ですか? それが役立つ場合は、さらに多くのコードを投稿できます。

4

3 に答える 3

1

あなたのリポジトリは delegate を受け入れ、特定の delegate を期待するという期待を設定していますt => t.PassResetCode.Equals("test1")。内部のモックは、渡された述語をこのデリゲートと比較すると思います。異なるデリゲート インスタンスは、99.99% の確率で一致しません。おそらく、この特定の期待で述語に特定の制約を設定することは避け、It.IsAny<>()代わりに使用する必要があります。

var mock = new Mock<IUnitOfWork>();
mock.Setup(It.IsAny<Func<User, bool>>(), null, ""), ...).Returns(...)
于 2013-04-02T15:44:04.480 に答える