【问题标题】:writing unit test for an action with User.Identity Name as Integer为 User.Identity Name 为 Integer 的操作编写单元测试
【发布时间】:2012-11-22 06:19:03
【问题描述】:

我正在使用带有 Web Api 的 ASP.NET MVC 3 的单元测试来编写测试用例。

现在我有一个动作,它调用了我在服务层中定义的一些方法,我在其中使用了以下代码行。

var userId = ((Project)(User.Identity)).UserId;

Project 类在哪里

using System;
using System.Security.Principal;
using System.Web.Security;



namespace Project.Web.Core.Models
{ 
[Serializable]
public class ProjectUser : IIdentity
{
    public ProjectUser(){} 
    public int UserId { get; set; }
  }
}

现在如何为此创建单元测试方法,我得到空引用异常。我是编写单元测试的新手 谁能帮帮我

【问题讨论】:

  • 理想情况下,您应该在编写单元测试时模拟外部服务调用或程序外部的任何内容。简而言之,为了单元测试,将外部服务替换为您自己的测试服务甚至是硬编码的值。 搜索可以为您提供有关如何创建模拟的更多详细信息,具体取决于您使用的单元测试框架或工具。
  • 所以你说我应该嘲笑IIdentity???
  • 我指的是这部分现在“我有一个动作可以调用我在服务层中定义的某些方法”。你应该模拟服务调用和服务的返回值。这样你就可以用你得到的任何返回值对你的“动作”进行单元测试。
  • 附带说明,当且仅当由于单元测试导致空引用错误来自您的操作代码时,您的操作需要一些调整来处理空值。这也意味着您的单元测试在一定程度上发挥了作用。

标签: asp.net-mvc unit-testing identity


【解决方案1】:

类似这个问题:Testing controller Action that uses User.Identity.Name

User.Identity 对象在其中的 HttpContext 不存在于单元测试的上下文中,它只存在于在 ASP.NET 进程中运行的代码的上下文中。

如果您将 HttpContext 作为参数传递给服务方法,可能会更容易编写单元测试。然后你可以使用类似于this answer 的代码来引用问题:

var mock = new Mock<UnknownServiceClass>();
var mockedUser = new ProjectUser(){ UserId = 1 };
mock.SetupGet(p => p.HttpContext.User).Returns(mockedUser);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2012-01-06
    • 2013-06-02
    相关资源
    最近更新 更多