【问题标题】:How to pass UserIdentity from test in unit testing如何在单元测试中从测试中传递 UserIdentity
【发布时间】:2016-12-30 12:44:08
【问题描述】:

我正在尝试为我的 web api 方法编写测试用例。

 [Fact]
 public async Task Get_Message_By_Id()
 {
    var messages = new Messages()
    {
        MessageId = 1,
        Recipient = "1;2;3",
        Subject = "Test Subject",
        MessageText = "test subject"
    };

    var mesBL = new Mock<IMessagesBusinessLogic>();
        mesBL
            .Setup(repo => repo.GetRecivedMessageById(It.IsAny<IWebToken>() ,messages.MessageId))
            .Returns(Task.FromResult(messages));

    var messageController = new MessagesController(mesBL.Object);

    var contentResult = await messageController.GetRecivedMessageById(messages.MessageId) as OkObjectResult; 

    Assert.NotNull(contentResult);
 }

我在调用GetRecivedMessageById 方法时收到null reference 错误。

控制器方法;

[HttpGet]
[Route("{id:int}")]
public async Task<IActionResult> GetRecivedMessageById(int id)
{
    return Ok(await _messagesBusinessLogic.GetRecivedMessageById(User.GetWebToken(), id));
}

这里,问题是因为,用户身份传递 NULL。

我们怎样才能通过测试呢?

【问题讨论】:

标签: c# unit-testing testing asp.net-core moq


【解决方案1】:

Usernull,因为在执行被测方法之前,它没有在测试中设置。

//Create test user
var displayName = "User name";
var role = "SomeRole";

var token = new Mock<IWebToken>();
token.Setup(m => m.DisplayName).Returns(displayName);
token.Setup(m => m.Role).Returns(role);

var identity = new UserIdentity(token.Object);

var principal = new GenericPrincipal(identity, roles: new string[] { });
var user = new ClaimsPrincipal(principal);
// Set the User on the controller via the ControllerContext
var messageController = new MessagesController(mesBL.Object) {
    ControllerContext = new ControllerContext()
    {
        HttpContext = new DefaultHttpContext() { User = user }
    }
};

【讨论】:

  • 好的,这适用于 web api 2,如帖子中标记的那样,您可能需要删除该标记。 Core 的用户是只读的。现在检查如何设置。很可能是通过 HttpContext。
  • 好的,更新的答案没有给出任何错误,让我检查一下。
  • 刚刚注意到您在扩展方法中转换为UserIdentity。您需要修改测试设置以符合该期望。对示例中的GenericIdentity 进行简单更改。
  • @HinaKhuman 这个UserIdentity 类在哪里定义。网上搜索好像找不到。
  • 好的,我明白了。正确的。那么您所要做的就是创建该身份并将其分配给示例中的主体,您应该一切顺利。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 2022-10-09
  • 2017-09-11
  • 2015-08-21
  • 2017-06-14
相关资源
最近更新 更多