Mock IHttpContextAccessor in Unit Tests

In my scenario I had to mock IHttpContextAccessor and access the inner request url bits.
I'm sharing it here because I spent a decent amount of time figuring this out and hopefully it'll help someone.

readonly Mock<IHttpContextAccessor> _HttpContextAccessor = 
  new Mock<IHttpContextAccessor>(MockBehavior.Strict);

void SetupHttpContextAccessorWithUrl(string currentUrl)
  var httpContext = new DefaultHttpContext();
  setRequestUrl(httpContext.Request, currentUrl);

    .SetupGet(accessor => accessor.HttpContext)

  static void setRequestUrl(HttpRequest httpRequest, string url)
      .FromAbsolute(url, out var scheme, out var host, out var path, out var query, 
        fragment: out var _);

    httpRequest.Scheme = scheme;
    httpRequest.Host = host;
    httpRequest.Path = path;
    httpRequest.QueryString = query;

You can use the DefaultHttpContext as a backing for the IHttpContextAccessor.HttpContext. Saves you having to set-up too many things

Next you cannot use It.IsAny<string>() as a Returns result. They were meant to be used in the set up expressions alone.

Check the refactor

public async Task test_GetBookByBookId() {

    //Mock IHttpContextAccessor
    var mockHttpContextAccessor = new Mock<IHttpContextAccessor>();
    var context = new DefaultHttpContext();
    var fakeTenantId = "abcd";
    context.Request.Headers["Tenant-ID"] = fakeTenantId;
    mockHttpContextAccessor.Setup(_ => _.HttpContext).Returns(context);
    //Mock HeaderConfiguration
    var mockHeaderConfiguration = new Mock<IHeaderConfiguration>();
        .Setup(_ => _.GetTenantId(It.IsAny<IHttpContextAccessor>()))

    var book = new Book(mockHttpContextAccessor.Object, mockHeaderConfiguration.Object);

    var bookId = "100";

    var result = await book.GetBookByBookId(bookId);


There may also be an issue with the Class Under Test as it is manually initializing the HeaderConfiguration when it should actually be explicitly injected.

public Book(IHeaderConfiguration headerConfiguration, IHttpContextAccessor httpContextAccessor) {
    _httpContextAccessor = httpContextAccessor;
    _tenantID = headerConfiguration.GetTenantId(_httpContextAccessor);

If you are making use of the wonderful NSubstitute package for NUnit, you can do this...

        var mockHttpAccessor = Substitute.For<IHttpContextAccessor>();
        var context = new DefaultHttpContext
            Connection =
                Id = Guid.NewGuid().ToString()
        // usage...