单元测试依赖于多种方法的方法

时间:2012-07-27 23:04:19

标签: c# unit-testing c#-4.0 moq

我有MethodA在一个单独的类中调用MethodB(一个在接口之后)。

MethodB中有StreamReader,因此我将new StreamReader()的调用重构为新的MethodC(与MethodB相同的类)。

为了测试MethodA,我需要模拟MethodB,但我还需要能够通过模拟MethodB来测试MethodC

(我想很清楚我有点失落。)

namespace JimBob.CsvImporter.Entity
{

public interface IIOManager
{
    TextReader ReturnReader(string path);

    int GetNumberOfColumnsInFile(string filePath, List<string> errorMessageList);
}


public class IOManager : IIOManager
{
    //MethodC
    public TextReader ReturnReader(string filePath)
    {
        return new StreamReader(filePath);
    }

    //MethodB
    public int GetNumberOfColumnsInFile(string filePath, List<String> errorMessageList)
    {
        int numberOfColumns = 0;
        string lineElements = null;

        try
        {
            using (StreamReader columnReader = (StreamReader)ReturnReader(filePath))
            {
                lineElements = columnReader.ReadLine();
                string[] columns = lineElements.Split(',');
                numberOfColumns = columns.Length;
            }
            return numberOfColumns;
        }
        catch (Exception ex)
        {
            errorMessageList.Add(ex.Message);
            return -1;
        }
    }
}


public class EntityVerification
{

    private IIOManager _iomgr;

    public EntityVerification(IIOManager ioManager)
    {
        this._iomgr = ioManager;
    }

    //MethodA
    public void ValidateNumberOfColumns(
        string filePath, int userSpecifiedColumnCount, 
         List<String> errorMessageList
   )
    {
        int numberOfColumnsInFile = 
            _iomgr.GetNumberOfColumnsInFile(filePath, errorMessageList);

        if (userSpecifiedColumnCount != numberOfColumnsInFile) errorMessageList.Add(
            "Number of columns specified does not match number present in file.");
    }

目前我的测试如下:

    [Test]
    public void GetNumberOfColumnsInFile_ReturnsNumberOfColumns_Returns6()
    {
        Mock<IIOManager> mock = new Mock<IIOManager>();
        mock.Setup(x => x.ReturnReader(It.IsAny<string>())).Returns(
           new StringReader("the,big,fat,dog,ate,cats"));
        EntityVerification testObject = new EntityVerification(mock.Object);
        List<String> errorMessageList = new List<string>();
        int i = testObject.GetNumberOfColumnsInFile("blabla.txt", errorMessageList);
        Assert.AreEqual(i , 6);
    }

但这是因为它是实体验证类的一部分。

我错过了什么吗?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

MethodA的测试中,模拟MethodB。在单独的测试中,模拟MethodC来测试MethodB

MethodA的测试独立于MethodB的测试,所以不要过多考虑这个。