public void Execute_ValidatesInput_InitialisesDictionarires_SolvesWordLadder_WritesAnswerFile_OpensAnswerFile() { var exceptionCaught = false; var startWord = "sure"; var endWord = "HIRE"; var wordDictionaryFilePath = ".\\words.txt"; var wordLadderResultFilePath = "answers.txt"; var args = new Options(startWord, endWord, wordDictionaryFilePath, wordLadderResultFilePath); IDictionary <string, bool> dictionary = new Dictionary <string, bool>() { { "SAME", false }, { "TIME", false }, { "TAME", false }, { "SOME", false }, { "MUST", false }, { "HIRE", false }, { "SIRE", false }, { "SITE", false } }; IDictionary <string, ICollection <string> > preProcessedDictionary = new Dictionary <string, ICollection <string> >() { { "*AME", new[] { "SAME", "TAME" } }, { "S*ME", new[] { "SAME", "SOME" } }, { "SA*E", new[] { "SAME" } }, { "SAM*", new[] { "SAME" } }, { "T*ME", new[] { "TAME", "TIME" } }, { "TA*E", new[] { "TAME" } }, { "TAM*", new[] { "TAME" } }, { "TI*E", new[] { "TAME" } }, { "TIM*", new[] { "TIME" } }, { "*OME", new[] { "SOME" } }, { "SO*E", new[] { "SOME" } }, { "SOM*", new[] { "SOME" } }, { "*IRE", new[] { "SIRE", "HIRE" } }, { "S*RE", new[] { "SIRE" } }, { "SI*E", new[] { "SIRE", "SITE" } }, { "SIR*", new[] { "SIRE" } }, { "*ITE", new[] { "SITE" } }, { "S*TE", new[] { "SITE" } }, { "SIT*", new[] { "SITE" } } }; var wordLadderSolved = new List <string>() { "SURE", "SIRE", "HIRE" }; _inputValidator.Validate(Arg.Is <Options>(args), Arg.Invoke(args)); _wordDictionaryService.Initialise(Arg.Is <Options>(args)); _wordDictionaryService.GetWordDictionary().Returns(dictionary); _wordDictionaryService.GetPreprocessedWordsDictionary().Returns(preProcessedDictionary); _wordLadderSolver.SolveLadder(Arg.Is(startWord), Arg.Is(endWord), Arg.Is(dictionary), Arg.Is(preProcessedDictionary)) .Returns(wordLadderSolved); // ACT _sut.Execute(args, s => { exceptionCaught = true; }); // ASSERT Assert.False(exceptionCaught); _inputValidator.Received(1).Validate(Arg.Is <Options>(args), Arg.Invoke(args)); _wordDictionaryService.Received(1).Initialise(Arg.Is <Options>(args)); _wordLadderSolver.Received(1).SolveLadder(Arg.Is(startWord), Arg.Is(endWord), Arg.Is(dictionary), Arg.Is(preProcessedDictionary)); _openFileHelper.Received(1).OpenFile(Arg.Is <string>(a => a.Contains(wordLadderResultFilePath))); _fileWrapper.Received(1).Write(Arg.Any <IList <string> >(), Arg.Is(wordLadderResultFilePath)); }