3

ユニットテストにMoqを使用することへのいくつかの言及に出くわしました。しかし、moqのwikiの例を見た後、モックリポジトリを作成するだけで何のメリットも実際にはわかりません。私は何かが足りないのですか。以下は、私が作成したモックリポジトリの例です。moqはこれをどのように最適化できますか?

    namespace Models
    {
        public class MockImagesRepository : IImagesRepository
        {
            private readonly BlogContext _context;
            private readonly List<ImageViewModel> _imageViewModels;

            public MockImagesRepository()
            {
                _context = new BlogContext();
                _imageViewModels = new List<ImageViewModel>();
                for (var i = 0; i < 10; i++)
                {
                    _imageViewModels.Add(new ImageViewModel
                                             {
                                                 Id = i,
                                                 AlternateText = "AlternateText " + i,
                                                 Description = "Description " + i,
                                                 Name = "Name " + i,
                                             });
                }
                for (var i = 10; i < 20; i++)
                {
                    _imageViewModels.Add(new ImageViewModel
                                             {
                                                 Id = i,
                                                 AlternateText = "AlternateText " + i,
                                                 Description = "Description " + i,
                                                 Name = "Name " + i,
                                             });
                }
                for (var i = 20; i < 30; i++)
                {
                    _imageViewModels.Add(new ImageViewModel
                                             {
                                                 Id = i,
                                                 AlternateText = "AlternateText " + i,
                                                 Description = "Description " + i,
                                                 Name = "Name " + i,
                                             });
                }

            }

            public int GetCount()
            {
                return _imageViewModels.Count;
            }

            public IEnumerable<ImageViewModel> FindRange(string format, int i, int recordsCount)
            {
                return _imageViewModels.Skip(i).Take(recordsCount);
            }

            public void Add(Image image)
            {
            }

            public IEnumerable<Image> GetImages()
            {
                var images = new List<Image>();
                foreach (var imageViewModel in _imageViewModels)
                {
                    images.Add(new Image(imageViewModel));
                }
                return images;
            }

            #region Implementation of IDisposable

            public void Dispose()
            {
                _context.Dispose();
            }

            #endregion


 }
}
4

4 に答える 4

4

Moqを使用すると、モックオブジェクトを手動で作成するために作成する必要はありません。これだけで時間を節約できます。

これらのモックオブジェクトを手動で作成する代わりに、Moqをセットアップして、呼び出される内容や方法に応じて動作する方法を指示します。

この方法論を使用すると、次のことができるようになります。

  • 異なる入力に基づいてさまざまな応答を設定するか、入力に関係なく同じ結果を提供します(設定を使用)

  • パラメータのcatchall値を送信することにより、テストコードを簡素化できます(It.IsAny<>またはIt.Is<>を使用)

  • メソッドが呼び出された回数、またはメソッドが呼び出されたかどうかを確認します。(検証を使用)。これにより、特定の依存関係が定義された回数、正しいパラメーターで呼び出されたことをテストできます。

  • コードが特定の例外をスローすることを設定または確認します(スローを使用)

Moqをマスターすると、適度に複雑なテストケースの場合、テストケースを作成することでメリットが得られます。

もちろん、これらすべてを手動で行うこともできますが、モックにこれらの機能を書き込むには時間がかかります。

于 2012-06-26T15:43:39.797 に答える
3

特定のシナリオでは、アプローチが最も簡単な場合があります。ただし、モックしているオブジェクトの動作がより複雑または多様である場合、多くの場合、次のいずれかになります。

  • 機能がわずかに異なるモッククラスの急増。
  • バグを簡単に発生させる可能性のあるモックの動作を調整するためのあらゆる種類のコントロールを備えた1つのモッククラス。

Moqのようなモックライブラリを使用すると、動作を非常に明確に定義でき、多くの場合、テストに沿って定義できるため、相互作用がはるかに明確で直接的になります。

于 2012-06-26T15:36:22.047 に答える
0

Moqを使用すると、作成したリポジトリをスキップできます。ただし、モックオブジェクトの主な用途は、単体テストを分離することです。

例:オブジェクトがいくつかのデータとどのように反応するかをテストしたい場合。そのデータをモックすることができます。

あなたの場合、あなたは次のようなことをすることができます:

// Create the mock from your interface
var mock = new Mock<IImagesRepository>();

// Setup the mock so it will return what you want
mock.Setup(foo => foo.GetImages()).Returns(new ImageViewModel
                                         {
                                             Id = i,
                                             AlternateText = "AlternateText " + i,
                                             Description = "Description " + i,
                                             Name = "Name " + i,
                                         });

// Then you can use it
functionThatNeedAnImageViewModel(mock.Object.GetImages());

詳細については、このMoqクイックスタートをご覧ください。

于 2012-06-26T15:34:43.480 に答える
0

最終的に、2つのリポジトリ(1つは本物、もう1つは偽物)を維持することになります。さらに悪いことに、多くのコーディングを行わない限り、偽物は実際にはすべてを偽造することはできません。たとえば、2つのオブジェクト間の関係などです。例よりも少し複雑なオブジェクトがある場合、最終的には価値がなくなります。

それ以上に、リポジトリに依存するクラスをテストする場合、リポジトリはテストの焦点では​​ないため、MOQやRhinoMockなどのフレームワークを使用してモックする方がはるかに簡単です。

于 2012-06-26T15:41:24.010 に答える