Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否对该部件进行单元测试_C#_Unit Testing - Fatal编程技术网

C# 是否对该部件进行单元测试

C# 是否对该部件进行单元测试,c#,unit-testing,C#,Unit Testing,我有一个CSV类和一个CSV解析器类,以及它们的单元测试。我想知道是否必须删除以下单元测试的一部分: public class CSV{ public string[] columns GetColumns() { var columns = null; if (!string.IsNullOrEmpty(this.textReader.ReadLine()))

我有一个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)的三行代码吗

2) 删除最后三个断言后,
GetColumns\u returnscorrictline
测试方法是否执行了正确的单元测试


请注意,已经有代码对CSV解析器的
GetColumns()
方法进行单元测试。GetColumns的功能是解析制表符删除的字符串并将其转换为列

有什么想法吗

必须删除断言列(a、b、c)的三行代码吗

tl;医生:

如果要确保“a\tb\tc”导致[“a”、“b”、“c”]而不是[“b”、“a”、“c”],则应将其保留在中。前两行只检查它是否不为null,长度、内容可以是任何内容

请注意,已经有代码对CSV进行单元测试 解析器的GetColumns()方法

这些测试是什么?如果看不到它们,很难判断它们是否重叠

必须删除断言列(a、b、c)的三行代码吗

tl;医生:

如果要确保“a\tb\tc”导致[“a”、“b”、“c”]而不是[“b”、“a”、“c”],则应将其保留在中。前两行只检查它是否不为null,长度、内容可以是任何内容

请注意,已经有代码对CSV进行单元测试 解析器的GetColumns()方法


这些测试是什么?很难在看不到它们的情况下判断它们是否重叠。

应该检查这些值,但不要像您现在所做的那样

有了NUnit,就有了
CollectionAssert

CollectionAssert.AreEqual(new [] {"a", "b", "c"}, columns);

应该检查这些值,但不要像您现在所做的那样

有了NUnit,就有了
CollectionAssert

CollectionAssert.AreEqual(new [] {"a", "b", "c"}, columns);

看起来您正在尝试测试CSV.GetColumns()

GetColumns()有三条路径

1) text reader.ReadLine()返回null=>返回null
2) textReader.ReadLine()返回“”=>返回null
3) ReadLine()返回!string.NullOrEmpty()=>返回CsvParser的输出

应该进行三项测试

TextReader返回null=>结果为null
TextReader返回“”=>结果为空
TestReader returns=>结果是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);

    }
}
公共接口ITextReader{
字符串ReadLine();
}
公共接口ICsvParser{
字符串[]获取列(字符串行);
}
公共类CSV{
私有只读ITextReader文本阅读器;
专用只读ICsvParser csvParser;
公共CSV(ITextReader文本阅读器、ICsvParser csvParser){
this.textleader=textleader;
this.csvParser=csvParser;
}
公共字符串[]GetColumns(){
string[]columns=null;
var line=this.textReader.ReadLine();
如果(!string.IsNullOrEmpty(行)){
columns=this.csvParser.GetColumns(第行);
}
返回列;
}
}
[测试类]
公共类CSVFixture{
私人模拟文本阅读器;
私人模拟仿制CSVParser;
私人CSV;
私有只读静态字符串[]列=新字符串[]{};
[测试初始化]
公共作废设置(){
mockTextReader=新建Mock();
mockCsvParser=新建Mock();
csv=新csv(mockTextReader.Object、mockCsvParser.Object);
}
[测试方法]
公共无效零行(){
执行(空);
}
[测试方法]
public void EmptyLine(){
执行(“”);
}
[测试方法]
public void PopulatedLine(){
执行(“SomeLineValue”,列);
}
私有void Execute(字符串行,字符串[]应为null){
mockTextReader.Setup(mk=>mk.ReadLine()).Returns(line);
mockCsvParser.Setup(mk=>mk.GetColumns(行)).Returns(Columns);
var-actual=csv.GetColumns();
断言.AreEqual(实际、预期);
}
}

其他要点:只要只从这里调用CsvParser,它只是在移动代码,但您可以更改CsvParser,以便在输入为null或为空时返回null。这意味着您不必在每次调用CsvParser时都检查它。

看起来好像您正在尝试测试CSV.GetColumns()

GetColumns()有三条路径

1) text reader.ReadLine()返回null=>返回null
2) textReader.ReadLine()返回“”=>返回null
3) ReadLine()返回!string.NullOrEmpty()=>返回CsvParser的输出

应该进行三项测试

TextReader返回null=>结果为null
TextReader返回“”=>结果为空
TestReader returns=>结果是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);

    }
}
公共接口ITextReader{
字符串ReadLine();
}
公共接口ICsvParser{
字符串[]获取列(字符串行);
}
公共类CSV{
私有只读ITextReader文本阅读器;
专用只读ICsvParser csvParser;
公共CSV(ITextReader文本阅读器、ICsvParser csvParser){
this.textleader=textleader;
this.csvParser=csvParser;
}
公共字符串[]GetColumns(){
string[]columns=null;
var line=this.textReader.ReadLine();
如果(!string.IsNullOrEmpty(行)){
columns=this.csvParser.GetColumns(第行);
}
返回列;
}