I'm currently working with Web API v5.2.2 and I'm writing Unit Test code for one of the controllers. The problem I encountered was happening in ApiController.User part.
I have a custom Identity for the user implemented IIdentity Interface:
public class CustomIdentity : IIdentity { //Constructor and methods } The CustomIdentity was set in the HttpRequest in normal usage. But since I'm only testing the query functionalities in the Unit Test, I just called the controller and its methods instead of sending requests.
Thus, I have to insert the User Identity into the Thread, and I tried with following ways:
var controller = new AccountsController(new AccountUserContext()); First try:
controller.User = new ClaimsPrincipal(new GenericPrincipal(new CustomIdentity(user), roles.Distinct().ToArray())); And second try:
IPrincipal principal = null; principal = new GenericPrincipal(new CustomIdentity(user), roles.Distinct().ToArray()); Thread.CurrentPrincipal = principal; if (HttpContext.Current != null) { HttpContext.Current.User = principal; } However, I got this error from both attempts:
Object reference not set to an instance of an object.
And I found the User identity remains null in the thread.
Anyone tried this method before? Thank you for the advice!