dimanche 28 février 2016

How do I mock a text output from reading a file in C# using the Moq Framework on Monodevelop

I've been banging my head on this all weekend. Basically I am doing a code kata for Game of Life and it involves reading in a text file. I take in that text file which contains two dimensional representation of the grid and stores all the points in a List of List's. I am trying to mock the text input obtained from the file to just be '\n' a new line so I can write unit tests checking that there is a new List being created within the List of Lists. I have created a file wrapper to handle the reading of the text file and that is what I am trying to mock. The code complies fine but the test fails with the error message "System.ArgumentException : The specified path is not of a legal form". It seems to still be expecting a file path but the mocking should change this behaviour right? Any help would be appreciated.


using System.Collections.Generic;

namespace GameOfLife
{
    public class InitializeGrid
    {

        public InitializeGrid ()
        {
        }

        public List<List<char>> CreateCharMatrix (string filePathName)
        {
            // Reads in the text file containing the grid data
            FileWrapper fileWrapper = new FileWrapper ();
            string inputGridTextFile = fileWrapper.ReadTextFromFile (filePathName);

            // Creates character matrix and initialises the first sub List
            List<List<char>> charMatrix = new List<List<char>> ();
            charMatrix.Add(new List<char>());

            int rowIndex = 0;
            int colIndex = 0;

            foreach (char cell in inputGridTextFile) {
                if (cell == '\n') {
                    charMatrix.Add (new List<char> ());
                    rowIndex++;
                    colIndex = 0;
                } else {
                    charMatrix [rowIndex] [colIndex] = cell;
                    colIndex++;
                }
            }

            return charMatrix;
        }

    }
}


using NUnit.Framework;
using System;
using System.Collections.Generic;
using Moq;

namespace GameOfLife

    [TestFixture()]
    public class InitializeGridTest
    {
        [Test()]
        public void CreateCharMatrix_EnsuresThatWhenEndOfLineReachedNewSubListCreated()
        {
            //Arrange

            InitializeGrid initializeGrid = new InitializeGrid ();
            List<List<char>> charMatrix;
            string filePathName = " ";

            Mock<IFileWrapper> mockFileWrapper = new Mock<IFileWrapper> ();
            mockFileWrapper.Setup<string> (m => m.ReadTextFromFile (It.IsAny<string>())).Returns ("\n");
            mockFileWrapper.Setup (m => m.ReadTextFromFile (It.IsAny<string>())).Returns ("\n");

            //Act
            charMatrix = initializeGrid.CreateCharMatrix (filePathName);
            int countProvingAnAdditionalListHasBeenAdded = charMatrix.Count;

            //Assert
            Assert.AreEqual (2, countProvingAnAdditionalListHasBeenAdded);
        }
    }


using System;
using System.IO;

namespace GameOfLife
{
    public class FileWrapper : IFileWrapper
    {
        public string ReadTextFromFile(string path)
        {
            return File.ReadAllText (path);
        }
    }
}


using System;

namespace GameOfLife
{
    public interface IFileWrapper
    {
        string ReadTextFromFile(string filePathName);
    }
} 

Aucun commentaire:

Enregistrer un commentaire