0

Mise à jour solution complète:Test Unit - Comment définir l'utilisateur du contrôleur pour objet principal générique

méthode WebAPI contrôleur que je vais tester:

using Microsoft.AspNet.Identity; 
using System.Web.Http; 


[Authorize] 
public class GigsController : ApiController 
{ 
    private readonly IUnitOfWork _unitOfWork; 

    public GigsController(IUnitOfWork unitOfWork) 
    { 
     _unitOfWork = unitOfWork; 
    }   

    [HttpDelete] 
    public IHttpActionResult Cancel(int id) 
    { 
     var userId = User.Identity.GetUserId(); 
     var gig = _unitOfWork.Gigs.GetGigWithAttendees(id); 

     if (gig.IsCanceled) 
      return NotFound(); 

     if (gig.ArtistId != userId) 
      return Unauthorized(); 

     gig.Cancel(); 

     _unitOfWork.Complete(); 

     return Ok(); 
    } 
} 

Unité classe Test:

[TestClass] 
public class GigsControllerTests 
{ 
    private GigsController _controller; 
    public GigsControllerTests() 
    { 
     var identity = new GenericIdentity("[email protected]"); 
     identity.AddClaim(
      new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", "[email protected]")); 
     identity.AddClaim(
      new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", "1")); 

     var principal = new GenericPrincipal(identity, null); 

     var mockUoW = new Mock<IUnitOfWork>(); 
     _controller = new GigsController(mockUoW.Object); 
     _controller.User = principal; 
    } 

Je reçois l'erreur suivante:

Erreur CS0200 propriété ou indexeur 'ApiController.User' ne peuvent pas être attribués à - il est en lecture seule

https://i.stack.imgur.com/YDQJS.png

+0

C'est incorrect. ['ApiController.User'] (https://msdn.microsoft.com/en-us/library/system.web.http.apicontroller.user (v = vs.118) .aspx) n'est pas en lecture seule. Vous devez donc fournir un [mcve] qui peut être utilisé pour reproduire le problème. De cette façon, nous pouvons mieux évaluer la véritable cause du problème. – Nkosi

+0

Salut Nkosi, J'ai mis à jour la solution complète, Il montre toujours que l'ApiController.User est en lecture seule – Arjuna

+0

Afficher aussi la déclaration 'GigsController'. – Nkosi

Répondre

0

Je suis tombé sur ce même problème en suivant les tutoriels de Moshi, et cela m'a bloqué pendant quelques bonnes heures avant que je puisse enfin résoudre ce problème.

En fin de compte, ce qui fixe pour moi changeais ma déclaration à l'aide de:

utilisant GigHub.Controllers;

à

utilisant GigHub.Controllers.Api;

Votre contrôleur GigsController pointe vers le contrôleur lui-même et non vers ApiController. J'aurais aimé que Moshi mette "Api" au nom de ses classes d'API de cette façon que vous sachiez si vous regardiez le contrôleur pur ou la version API du contrôleur sans devoir vérifier les espaces de noms ou aller à la définition sur vos objets.

Vous avez raison de dire que la propriété User de la classe Controller ne dispose en effet que d'un Get. La propriété User de la classe ApiController possède cependant à la fois un Get et un Set.

public abstract class ApiController : IHttpController, IDisposable 
{ 
    public IPrincipal User { get; set; } 
} 

J'espère que cela a été votre problème aussi et vous aide!

À la votre!

0

Réglage Au lieu de l'CurrentPrincipal votre fil d'exécuter

Thread.CurrentPrincipal = principal; 
0

Vous pouvez attribuer par ControllerContext

var user = new ClaimsPrincipal(); 
var context = new ControllerContext 
{ 
    HttpContext = new DefaultHttpContext 
    { 
     User = user 
    } 
}; 

controllerUnderTest.ControllerContext = context;