Xperience unit test mocking of content query executor

Ivan Peev asked on February 28, 2024 17:00

An Xperience project I'm working on contains the following interface:

public interface IContentRepository
{
    Task<IEnumerable<T>> GetWebPageAsync<T>(
       ContentItemQueryBuilder builder,
       Cancellationtoken cancellationToken
    ) where T : new();
}

The implementation of this is:

public class ContentRepository : IContentRepository
{
   private readonly IContentQueryExecutor _contentQueryExecutor;
   private readonly IWebPageQueryResultMapper _webPageQueryResultMapper;
   private readonly IWebsiteChannelContext _websiteChannelContext;

   public ContentRepository(
      IContentQueryExecutor contentQueryExecutor,
      IWebPageQueryResultMapper webPageQueryResultMapper,
      IWebsiteChannelContext websiteChannelContext,
   )
   {
       _contentQueryExecutor = contentQueryExecutor;
       _webPageQueryResultMapper = webPageQueryResultMapper;
       _websiteChannelContext = websiteChannelContext;
   }

   public async Task<IEnumerable<T>> GetWebPageAsync<T>(
      ContentItemQueryBuilder builder,
      CancellationToken cancellationToken
   ) where T : new()
   {
       var queryOptions = new ContentQueryExecutionOptions()
       {
          ForPreview = _websiteChannelContext.IsPreview
       };

       return await _contentQueryExecutor.GetWebPageResult(
          builder: builder,
          resultSelector: _webPageQueryResultMapper.Map<T>,
          options: queryOptions,
          cancellationToken: cancellationToken
       );
    }
}

The idea behind this repository is that you can just do a single call to get web pages, content and such. For testing the method above I need to mock the _contentQueryExecutor.GetWebPageResult call to return an IEnumerable of the given page type. However nothing really seems to work. In my test file for example I do the following:

var homePage = new HomePage
{
   SystemFields = new WebPageFields
   {
       WebPageItemID = 1
   }
};

_webPageQueryResultMapper
   .Map<HomePage>(Arg.Any<IWebPageContentQueryDataContainer>())
   .Returns(homePage);

_contentQueryExecutor
    .GetWebPageResult(
        builder: Arg.Any<ContentItemQueryBuilder>(),
        resultSelector: _webPageQueryResultMapper.Map<HomePage>,
        options: Arg.Any<ContentQueryExecutionOptions>(),
        cancellationToken: Arg.Any<CancellationToken>()
    )
    .Returns([homePage]);

But the result always seems to be null from the _contentQueryExecutor. The _webPageQueryResultMapper returns the correct value however. I'm using NSubstitute and xUnit for my unit tests.

Correct Answer

Liam Goldfinch answered on February 29, 2024 09:41

Hi Ivan

This looks like an Xperience by Kentico question, please submit at the community portal as that is the place for Xperience by Kentico questions. See here

0 votesVote for this answer Unmark Correct answer

   Please, sign in to be able to submit a new answer.