public void GivenTwoCallsWithSameArgument_ThenUnderlyingServiceShouldBeCalledOnce()
        {
            var underlyingCacheDecorator = A.Fake <ISearchEngine>();
            var cacheDecorator           = new SearchEngineCachingDecorator(underlyingCacheDecorator, _memoryCache);

            cacheDecorator.GetSearchResultsForTerm("Hello");
            cacheDecorator.GetSearchResultsForTerm("Hello");
            A.CallTo(() => underlyingCacheDecorator.GetSearchResultsForTerm(A <string> ._)).MustHaveHappenedOnceExactly();
        }
        public void GivenACallToNameProperty_ThenUnderlyingServiceNameShouldBeReturned()
        {
            var underlyingCacheDecorator = A.Fake <ISearchEngine>();

            A.CallTo(() => underlyingCacheDecorator.Name).Returns("The Dude");
            var memoryCache    = A.Fake <IMemoryCache>();
            var cacheDecorator = new SearchEngineCachingDecorator(underlyingCacheDecorator, memoryCache);
            var name           = cacheDecorator.Name;

            name.Should().Be("The Dude");
        }
        public void GivenTwoCallsWithSameArgument_TheSameObjectShouldBeReturnedBothTimes()
        {
            var underlyingCacheDecorator = A.Fake <ISearchEngine>();
            List <SearchResult> expected = new List <SearchResult> {
                new SearchResult {
                    Title = "The Dude abides"
                }
            };

            A.CallTo(() => underlyingCacheDecorator.GetSearchResultsForTerm(A <string> ._)).Returns(
                expected
                );
            var cacheDecorator = new SearchEngineCachingDecorator(underlyingCacheDecorator, _memoryCache);
            var responseOne    = cacheDecorator.GetSearchResultsForTerm("Hello");
            var responseTwo    = cacheDecorator.GetSearchResultsForTerm("Hello");

            responseOne.Should().BeEquivalentTo(expected);
            responseTwo.Should().BeEquivalentTo(expected);
        }