wake-up-neo.net

Schreiben von Unit Test für Methoden, die User.Identity.Name in der ASP.NET-Web-API verwenden

Ich schreibe Testfälle mit dem Unit Test für ASP.NET-Web-API.

Jetzt habe ich eine Aktion, die eine Methode aufruft, die ich in der Service-Schicht definiert habe, wobei ich die folgende Codezeile verwendet habe.

string username = User.Identity.Name;
// do something with username
// return something

Nun, wie ich eine Komponententestmethode dafür erstellen kann, erhalte ich Nullreferenzausnahmen. Ich bin ein bisschen neu beim Schreiben von Unit-Tests und so.

Und ich möchte nur Unit Test dafür verwenden.

Bitte hilf mir dabei. Vielen Dank.

39
Yasser

Die folgende ist nur eine Möglichkeit, dies zu tun:

public class FooController : ApiController {

    public string Get() {

        return User.Identity.Name;
    }
}

public class FooTest {

    [Fact]
    public void Foo() {

        var identity = new GenericIdentity("tugberk");
        Thread.CurrentPrincipal = new GenericPrincipal(identity, null);
        var controller = new FooController();

        Assert.Equal(controller.Get(), identity.Name);
    }
}
45
tugberk

Hier ist eine weitere Möglichkeit, die ich im Test-Tutorial NerdDinner gefunden habe. Es hat in meinem Fall funktioniert:

DinnersController CreateDinnersControllerAs(string userName)
{

    var mock = new Mock<ControllerContext>();
    mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName);
    mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);

    var controller = CreateDinnersController();
    controller.ControllerContext = mock.Object;

    return controller;
}

[TestMethod]
public void EditAction_Should_Return_EditView_When_ValidOwner()
{

    // Arrange
    var controller = CreateDinnersControllerAs("SomeUser");

    // Act
    var result = controller.Edit(1) as ViewResult;

    // Assert
    Assert.IsInstanceOfType(result.ViewData.Model, typeof(DinnerFormViewModel));
}

Stellen Sie sicher, dass Sie den gesamten Abschnitt gelesen haben: Spottet die User.Identity.Name-Eigenschaft

Es verwendet das Moq-Mocking-Framework, das Sie mit NuGet in Ihrem Test project installieren können: http://nuget.org/packages/moq

16

Bei WebApi 5.0 ist dies etwas anders. Sie können jetzt tun:

controller.User = new ClaimsPrincipal(
  new GenericPrincipal(new GenericIdentity("user"), null));
13
jonnii

Nichts davon endete für mich. Ich habe die Lösung für eine andere Frage verwendet, in der Moq verwendet wird, um einen Benutzernamen im ControllerContext einzurichten: https://stackoverflow.com/a/6752924/347455

1
pennstatephil

Wenn ich Unit-Test durchführe, wird in meinem Fall die Windows-Authentifizierung verwendet, und Identity.Name ist mein Domänenname, den ich auch für den Test ändern möchte. So benutze ich einen solchen Ansatz mit "Hacking" -Dingen, die ich möchte IAuthenticationFilter

0
Alexander

Das ist meine Lösung.

var claims = new List<Claim>
{
    new Claim(ClaimTypes.Name, "Nikita"),
    new Claim(ClaimTypes.NameIdentifier, "1")
};

var identity = new ClaimsIdentity(claims);
IPrincipal user = new ClaimsPrincipal(identity);

controller.User = user;
0
Nikita

Wenn Sie viele Controller zum Testen haben, würde ich vorschlagen, eine Basisklasse zu erstellen und im Konstruktor eine GenericIdentity & GenericPrincipal zu erstellen und Thread.CurrentPrincipal zu setzen. 

GenericPrincipal principal = new GenericPrincipal(new 
    GenericIdentity("UserName"),null); Thread.CurrentPrincipal = principal; 

Dann erben Sie diese Klasse. Auf diese Weise hat jede Unit-Test-Klasse Principle Object Set 

[TestClass]
public class BaseUnitTest
{
    public BaseUnitTest()
    {
      GenericPrincipal principal = new GenericPrincipal(new GenericIdentity("UserName"),null);   
      Thread.CurrentPrincipal = principal;
    }
}


[TestClass]
public class AdminUnitTest : BaseUnitTest
{
   [TestMethod]
   public void Admin_Application_GetAppliction()
   {
   }
}
0
user3507981

Hier habe ich die Lösung für einen anderen Weg gefunden, wie man den Benutzeridentitätsnamen für die Prüfung auf Controller-Ebene anhand der Testmethode festlegen kann.

public static void SetUserIdentityName(string userId)
        {
            IPrincipal principal = null;
            principal = new GenericPrincipal(new GenericIdentity(userId), 
            new string[0]);
            Thread.CurrentPrincipal = principal;
            if (HttpContext.Current != null)
            {
                HttpContext.Current.User = principal;
            }
        }
0
Umapathy