编写单元测试在ASP.NET Web API中使用User.Identity.Name的方法

Yas*_*ser 41 .net asp.net unit-testing identity username

我正在使用ASP.NET Web API的单元测试编写测试用例.

现在我有一个动作调用我在服务层定义的一些方法,在那里我使用了以下代码行.

string username = User.Identity.Name;
// do something with username
// return something
Run Code Online (Sandbox Code Playgroud)

现在我如何为此创建单元测试方法,我得到空引用异常.我是一个新的编写单元测试和东西.

我想仅为此使用单元测试.

请帮我解决这个问题.谢谢.

tug*_*erk 47

以下只是一种方法:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个xUnit的东西.别担心. (3认同)
  • 值得注意的是,此解决方案不适用于MVC控制器......仅适用于API控制器. (3认同)
  • "[事实]"是什么意思? (2认同)

Len*_*rri 16

这是我在NerdDinner测试教程中找到的另一种方式.它适用于我的情况:

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));
}
Run Code Online (Sandbox Code Playgroud)

请务必阅读完整部分:模拟User.Identity.Name属性

它使用Moq您可以在Test project使用NuGet中安装的模拟框架:http://nuget.org/packages/moq


jon*_*nii 11

使用WebApi 5.0,这有点不同.你现在可以这样做:

controller.User = new ClaimsPrincipal(
  new GenericPrincipal(new GenericIdentity("user"), null));
Run Code Online (Sandbox Code Playgroud)

  • 我在System.Web.Mvc.dll中查看`Controller`的v5.2.0.0,而`IPrincipal User`只有`get`,no`set` ... (13认同)