Во время выполнения свойство ApiController.User
устанавливается задолго после вызова конструктора контроллера. Это будет означать, что ваш текущий поток вызова его в конструкторе, как
public DefaultController() {
AuthenticateUser();
}
имеет недостатки и не обеспечит ожидаемое поведение.
Давайте сначала исправим код, а затем посмотрим на модульный тест.
Используйте свойство вместо
private bool IsUserAuthenticated {
get {
return User.Identity.IsAuthenticated;
}
}
и соответственно изменить код
public class DefaultController : ApiController {
private bool IsUserAuthenticated {
get {
return User.Identity.IsAuthenticated;
}
}
[HttpGet]
public IHttpActionResult GetProducts() {
if (IsUserAuthenticated) { // do something }
else { // throw 401 }
}
[HttpPost]
public IHttpActionResult Update() {
if (IsUserAuthenticated) { // do something }
else { // throw 401 }
}
//...
}
Теперь, для тестирования ApiController
, свойство User
может быть установлено при организации модульного теста, чтобы тест выполнялся как ожидалось
Например
[TestMethod()]
public void DefaultController_Should_GetProducts() {
//Arrange
var username = "name_here";
var userId = 2;
var identity = new GenericIdentity(username, "");
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userId.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Name, username));
var principal = new GenericPrincipal(identity, roles: new string[] { });
var user = new ClaimsPrincipal(principal);
var controller = new DefaultController() {
User = user //<-- Set the User on the controller directly
};
//Act
var actionResult = controller.GetProducts();
//Assert
//...
}