0

CSV クラスと CSV パーサー クラス、およびそれらの単体テストがあります。以下の単体テストの一部を削除する必要があるかどうかを確認したい:

public class CSV{

public string[] columns GetColumns()
        {                       
           var columns = null;

            if (!string.IsNullOrEmpty(this.textReader.ReadLine()))
            {
               var columns = this.csvParser.GetColumns(line);              
            }

            return columns;
        }



  }

   [Test]
        public void GetColumns_ReturnsCorrectLine()
        {            
            reader.Setup(r => r.ReadLine()).Returns("a\tb\tc");


            //Act
            var columns = csvReader.GetColumns();

            //Assert
            Assert.IsTrue(columns!=null);
            Assert.AreEqual(3, columns.Length);

            Assert.AreEqual("a", columns[0]);
            Assert.AreEqual("b", columns[1]);
            Assert.AreEqual("c", columns[2]);
      }

質問

1) 列 (a、b、c) をアサートする 3 行のコードを削除する必要がありますか?

2)GetColumns_ReturnsCorrectLine最後の 3 つのアサーションを削除した後、テスト メソッドは正しい単体テストを実行しますか?

GetColumns()CSV パーサーのメソッドを単体テストするコードが既にあることに注意してください。GetColumns の機能は、タブ区切りの文字列を解析して列に変換することです。

何か案が?

4

3 に答える 3

2

Those values should be checked but not like you are doing.

With NUnit, there is CollectionAssert:

CollectionAssert.AreEqual(new [] {"a", "b", "c"}, columns);
于 2013-03-19T01:03:21.653 に答える
2

CSV.GetColumns() をテストしようとしているかのように見えます。

GetColumns()には 3 つのパスがあります

1) textReader.ReadLine() は null を返します => null を返します
2) textReader.ReadLine() は "" を返します => null を返します
3) testReader.ReadLine() は !string.NullOrEmpty() を返します => CsvParser からの出力を返します。

3つのテストはそれであるべきです

TextReader が null を返す => 結果が null
TextReader が "" を返す => 結果が null
TestReader が返す => 結果が CsvParser の戻り値です。

CsvParser によって返される値は重要ではありません - あなたが言及したように、CsvParser がその仕事を適切に行うことは他の場所でテストされています - パーサーの出力を返すと言いたいだけです。

public interface ITextReader {
    string ReadLine();
}

public interface ICsvParser {
    string[] GetColumns(string line);
}

public class CSV {
    private readonly ITextReader textReader;
    private readonly ICsvParser csvParser;

    public CSV(ITextReader textReader, ICsvParser csvParser) {
         this.textReader = textReader;
         this.csvParser = csvParser;
    }

    public string[] GetColumns() {                       
        string[] columns = null;
        var line = this.textReader.ReadLine();          

        if (!string.IsNullOrEmpty(line)){
           columns = this.csvParser.GetColumns(line);              
        }

        return columns;
    }

}

[TestClass]
public class CSVFixture {
    private Mock<ITextReader> mockTextReader;
    private Mock<ICsvParser> mockCsvParser;
    private CSV csv;

    private readonly static string [] Columns = new string[]{};

    [TestInitialize]
    public void Setup() {
        mockTextReader = new Mock<ITextReader>();
        mockCsvParser = new Mock<ICsvParser>();
        csv = new CSV(mockTextReader.Object, mockCsvParser.Object);
    }


    [TestMethod]
    public void NullLine() {
        Execute(null);
    }

    [TestMethod]
    public void EmptyLine() {
        Execute("");
    }

    [TestMethod]
    public void PopulatedLine() {
        Execute("SomeLineValue", Columns);
    }

    private void Execute(string line, string[] expected = null) {
        mockTextReader.Setup(mk => mk.ReadLine()).Returns(line);
        mockCsvParser.Setup(mk => mk.GetColumns(line)).Returns(Columns);

        var actual = csv.GetColumns();

        Assert.AreEqual(actual, expected);

    }
}

その他のポイント: CsvParser がここからのみ呼び出される限り、コードを移動するだけですが、入力が null または空の場合に null を返すように CsvParser を変更できます。これは、CsvParser を呼び出すたびにチェックする必要がないことを意味します。

于 2013-03-19T11:29:28.717 に答える
1

列 (a、b、c) をアサートする 3 行のコードを削除する必要がありますか?

tl;dr:いいえ

"a\tb\tc" が ["a", "b", "c"] になり、["b", "a", "c"] ではないことを確認したい場合は、そのままにしておく必要があります。 in. 最初の 2 行は、それが null ではないかどうかと、長さ、コンテンツが何でもかまいません。

CSV パーサーの GetColumns() メソッドを単体テストするコードが既にあることに注意してください。

それらのテストは何ですか?それらが重なり合っているかどうかは、見ないとわかりません。

于 2013-03-19T01:00:12.573 に答える