1

最近、NUnit フレームワークを使用してコードの単体テストを書き始めました。
NUnit の基本概念と簡単なテストの作成に精通しています。
実際、ファイルで動作するコードをテストする方法がわかりません。たとえば、以下のクラスのテストを書きたいです。

  public class ShapeLoader
    {
        private static void StreamLoading(object sender, StreamLoadingEventArgs e)
        {
            try
            {
                string fileName = Path.GetFileName(e.AlternateStreamName);
                string directory = Path.GetDirectoryName(e.AlternateStreamName);

                e.AlternateStream = File.Exists(directory + @"\\" + fileName) ? new FileStream(directory + @"\\" + fileName, e.FileMode, e.FileAccess) : null;
            }
            catch
            { }
        }

        public static ShapeFileFeatureLayer Load(string filePath, ShapeFileReadWriteMode shapeFileReadWriteMode, bool buildIndex = true)
        {
            if (!File.Exists(filePath)) { throw new FileNotFoundException(); }
            try
            {
                switch (shapeFileReadWriteMode)
                {
                    case ShapeFileReadWriteMode.ReadOnly:
                        //  if (buildIndex && !HasIdColumn(filePath)) BuildRecordIdColumn(filePath, BuildRecordIdMode.Rebuild);

                        ShapeFileFeatureLayer.BuildIndexFile(filePath, BuildIndexMode.DoNotRebuild);

                        var shapeFileLayer = new ShapeFileFeatureLayer(filePath, shapeFileReadWriteMode) { RequireIndex = true };
                        ((ShapeFileFeatureSource)shapeFileLayer.FeatureSource).StreamLoading += StreamLoading;
                        return shapeFileLayer;

                    case ShapeFileReadWriteMode.ReadWrite:
                        return new ShapeFileFeatureLayer(filePath, shapeFileReadWriteMode);

                    default:
                        return null;
                }
            }
            catch (Exception ex)
            {
                if (ex.Message.Contains("Could not find file")) throw new FileNotFoundException();
                throw;
            }
        }
    }

このコードは、正常に動作するかどうかを確認するために物理ファイルを必要としますが、単体テストが物理ファイルに依存していることは正しいですか?
このようなコードの単体テストを作成するにはどうすればよいですか?

4

3 に答える 3

3

単体テストは、ファイル システムやデータベースなどの外部リソースに依存するべきではありません。この場合、MoqRhino Mockなどのモック フレームワークを使用する必要があります。コードとそれが外部依存関係をテストしたい場合は、Integration Test.

したがって、あなたの場合、モッキングフレームワークを使用したくない場合は、依存関係用に独自の偽のクラスを作成し、それらを依存性注入パターンで渡すことができます

于 2013-02-03T13:28:17.900 に答える
1

使用している依存関係や外部リソースが何であれ、それぞれにモックを作成し、MOQなどのモックフレームワークを使用してテストを実行します。これが一例です。インターフェイスを作成し、インターフェイスを使用してモックを実装する方がよい

  var mockEmailRequest = new Mock<IEMailRequest>
  mockEmailResponse.setup(x+>x.EmailResponse).Returns(.....);
mockEmailRequest.Verify(r=>r.EmailReceived(It.Is<EmailResponse>(r=>r.Subject == "Something"),It.Is<int>(i=>i > 17)));
于 2013-02-05T03:48:29.533 に答える
1

私はこれを作成するのが好きです:

public abstract class FileSystem
{
     public abstract bool FileExists(string fullPath);
     public abstract Stream OpenFile(string fullPath, FileMode mode, FileAccess access);
}

次に、本番コード用に明白な方法で実装し、テスト コード用に簡単にモックできます。

[Test]
public void StreamReadingEventAddsStreamToEventArgsWhenFileExists()
{
     var e new StreamReadingEventArgs { e.AlternateStreamName= "Random string in path format", e.FileMode = AnyFileMode(), e.FileAccess = AnyFileAccess() };
     var expectedStream = new MemoryStream();
     _fileSystemMock.Setup(f=>f.OpenFile(e.AlternateStreamName, e.FileMode, e.FileAccess)).Returns(expectedStream);

     SomehowFireTheEvent(e);

     Assert.That(e.AlternateStream, Is.SameAs(expectedStream));
}

補足として、このコードには他のテスト容易性の問題があり、イライラさせられます。そのためのいくつかのテストを作成してから、製品コードとテストをcodereview.stackexchange.comに投稿してフィードバックを得ることをお勧めします。

于 2013-02-03T14:30:14.153 に答える