1

I am writing Unit Test for Function App which accept HttpRequest and run the secured api call with query parameters and some custom Headers and Bearer Token. I able to pass the query to request But how to add Headers is not working.

I have tried the following code, edited my code as per suggestion of @Nkosi

var postParam = new Dictionary<string, StringValues>();
postParam.Add("param1", "123");
request.Query = new QueryCollection(postParam);

var headers = new HttpClient().DefaultRequestHeaders;
headers.Add("Transaction", "1234");
var request = Mock.Of<HttpRequest>(_ =>
            _.Query == query && _.Headers == headers //<-- setup desired members
        );
var logger = Mock.Of<ILogger>();

var response = azureFunction.Run(request, logger);

Calling the following function

public static HttpResponseMessage Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
        ILogger log){
}

I am getting error here operater == can not be applied to IHeaderDictionary and HttpRequestHeaders

&& _.Headers == headers
  • Possible duplicate of [What is a NullReferenceException, and how do I fix it?](https://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – Sir Rufo Oct 01 '19 at 04:40

1 Answers1

1

Since using Linq-to-Mocks, the setup will need to be done differently

//Arrange
var postParam = new Dictionary<string, StringValues>();
postParam.Add("param1", "123");
var query = new QueryCollection(postParam);

var headers = new HttpRequestHeaders();
headers.Add("Transaction", "1234");

var request = Mock.Of<HttpRequest>(_ => 
    _.Query == query && _.Headers == headers //<-- setup desired members
);
var logger = Mock.Of<ILogger>();

//Act
var response = azureFunction.Run(request, logger);

//...

You could also mock the IHeaderDictionary instead

//Arrange
var postParam = new Dictionary<string, StringValues>();
postParam.Add("param1", "123");
var query = new QueryCollection(postParam);

//mock header dictionary
var headers = Mock.Of<IHeaderDictionary>(_ =>
    _["Transaction"] == "1234"
);

var request = Mock.Of<HttpRequest>(_ => 
    _.Query == query && _.Headers == headers //<-- setup desired members
);
var logger = Mock.Of<ILogger>();
Nkosi
  • 235,767
  • 35
  • 427
  • 472
  • var headers = new HttpRequestHeaders(); we can not instantiate HttpRequestHeader like that, its give error that, HttpRequestHeader does not contain a constructer that take 0 argument – Hasan Abrar Oct 01 '19 at 22:47
  • we can create instance like that var headers = new HttpClient().DefaultRequestHeaders; but then we get error on mock object
    && _.Headers == headers operater == can not be applied to IHeaderDictionary and HttpRequestHeaders
    – Hasan Abrar Oct 01 '19 at 23:24
  • 1
    @HasanAbrar You are using the wrong version. The docs says the constructor is public https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.server.kestrel.core.internal.http.httprequestheaders?view=aspnetcore-2.2 – Nkosi Oct 02 '19 at 00:03
  • Thanks @Nkosi by installing nu-get package Microsoft.AspNetCore.Server.Kestrel.Core and referencing HttpRequestHeaders to using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http it worked – Hasan Abrar Oct 02 '19 at 00:16