public void QuoteImporter_GivenMockFile_ShouldInsertIntoMockDatabase()
        {
            // 1. ReadFileListOfLines mock
            string actualLineFromFile = "";
            Func <IEnumerable <string> > readFileListOfLines = () =>
            {
                var listOfLines = new[] { "title, quote here" };
                actualLineFromFile = listOfLines[0];
                return(listOfLines);
            };

            // 2. ParseLine mock
            string actualLineSentToParseLine = "";
            Func <string, Quote> parseLine   = s =>
            {
                actualLineSentToParseLine = s;
                var quote = new Quote {
                    Title = "title2", Body = "quote here2"
                };
                return(quote);
            };

            // 3. InsertQuoteIntoDatabase mock
            // using a closure
            IList <Quote>  actualQuotes            = new List <Quote>();
            Action <Quote> insertQuoteIntoDatabase = quote =>
            {
                actualQuotes.Add(quote);
            };

            // compose.  Action is a delegate - doesn't return anything
            Action run = () => ImporterFunctional.QuoteImporter(
                readFileListOfLines, parseLine, insertQuoteIntoDatabase);

            run();

            // 1. Testing the ReadFileListOfLines mock was called
            Assert.Equal("title, quote here", actualLineFromFile);

            // 2. Testing the mock parser received the data from the ReadFileListOfLines mock
            Assert.Equal("title, quote here", actualLineSentToParseLine);

            // 3. Testing the mock database received the data from the ParseLine mock
            Assert.Equal("title2", actualQuotes[0].Title);
            Assert.Equal("quote here2", actualQuotes[0].Body);
        }