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)
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)