UnitTestEx
UnitTestEx copied to clipboard
HttpTriggerTester Expression Tree Limitations
HttpTriggerTester Expression Tree Limitations
Background
In my tests project, I have created an extension method using reflection to automatically get the route of my HTTP-Triggered-Functions with that method. The goal here was to eliminate requirements for test code updates after changes to a Function's route in the main code. It almost works.
I've since written my code around this limitation, but it requires me to spin up & run an entire HostTesterBase
implementor twice. 😰
Issue
HttpTriggerTester's Run/RunAsync methods, unlike TypeTester's, uses expression trees. SRC
public async Task<ActionResultAssertor> RunAsync(Expression<Func<TFunction, Task<IActionResult>>> expression)
This means that I am unable to write something like this without experiencing compilation errors:
var sut = await test
.HttpTrigger<QueueTaskCreateFunction>()
.RunAsync(f => f.Run(test.CreateHttpRequest(HttpMethod.Post, f.GetFunctionRoute(), contentType: MediaTypeNames.Text.Plain), context.Object));
A statement like this would work with TypeTester, but I can't use TypeTester to test my HTTP-Triggered-Function.
Is there a technical reason for HttpTriggerTester's Run/RunAsync methods not having an overload for Action<T>
or Func<T1,T2>
??
Workaround
The following boilerplate accomplishes what I intended without any issues:
var route = test
.Type<QueueTaskCreateFunction>()
.Run(f => f.GetFunctionRoute())
.Result;
var request = test
.CreateHttpRequest(HttpMethod.Post, route, contentType: MediaTypeNames.Text.Plain);
var sut = await test
.HttpTrigger<QueueTaskCreateFunction>()
.RunAsync(f => f.Run(request, context.Object));