1

別のクラス(インターフェースに従うクラス)MethodAを呼び出すaがあります。MethodB

MethodBが含まれていたStreamReaderので、への呼び出しを(と同じクラスの)new StreamReader()新しいものにリファクタリングしました。MethodCMethodB

テストするにMethodAは、モックする必要がありますが、モックでMethodBテストできる必要もあります。MethodBMethodC

(私は少し迷っていることが明らかになったと思います。)

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);
    }

しかし、これはそれがエンティティ検証クラスの一部であったときのためでした。

私は何かが足りないのですか?どんな援助もいただければ幸いです!

4

1 に答える 1

1

のテストではMethodA、モックMethodB。別のテストでは、モックMethodCしてテストしMethodBます。

のテストMethodAはのテストから独立しているMethodBので、これをあまり考えすぎないでください。

于 2012-07-27T23:56:04.177 に答える