Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于对.NET核心MVC控制器进行单元测试的模拟HttpContext?_C#_Asp.net Mvc_Unit Testing_Asp.net Core - Fatal编程技术网

C# 用于对.NET核心MVC控制器进行单元测试的模拟HttpContext?

C# 用于对.NET核心MVC控制器进行单元测试的模拟HttpContext?,c#,asp.net-mvc,unit-testing,asp.net-core,C#,Asp.net Mvc,Unit Testing,Asp.net Core,我正在进行单元测试的控制器中有一个函数,它期望http请求的头中有值。我无法初始化HttpContext,因为它是只读的 我的控制器函数需要“设备id”的http请求头值 有没有一种不使用第三方库的直接方法可以做到这一点?我可以用这种方法初始化httpcontext和header: [TestMethod] public void TestValuesController() { ValuesController controller = new ValuesController();

我正在进行单元测试的控制器中有一个函数,它期望http请求的头中有值。我无法初始化HttpContext,因为它是只读的

我的控制器函数需要“设备id”的http请求头值


有没有一种不使用第三方库的直接方法可以做到这一点?

我可以用这种方法初始化httpcontext和header:

[TestMethod]
public void TestValuesController()
{
    ValuesController controller = new ValuesController();
    controller.ControllerContext = new ControllerContext();
    controller.ControllerContext.HttpContext = new DefaultHttpContext();
    controller.ControllerContext.HttpContext.Request.Headers["device-id"] = "20317";
    var result = controller.Get();
    //the controller correctly receives the http header key value pair device-id:20317
    ...
}

与其模拟HTTPContext,不如将头映射到方法上的参数中。例如,在该答案底部的控制器中,
id
参数被设置为名称等于“device id”的值头。。。然后,单元测试变为

[TestMethod]
public void TestValuesController()
{
    ValuesController controller = new ValuesController();
    var result = controller.GetHeaderValue("27");
    Assert.AreEqual(result, "27");
}
虽然您可以模拟HttpContext,但在我看来,除非您别无选择,否则应该避免使用它。可以在此处找到FromHeaderAttribute的文档


不使用HttpContext?使用控制器的全部要点是,数据通过控制器的参数传递。如果您的控制器使用HttpContext来读取数据,就像它是WebForms页面一样,那么您就有问题了。@PanagiotisKanavos标头中的值是一条信息,指示呼叫来自哪个移动设备。这是检索正确数据的必要条件。设备ID位于标头中,因为身份验证需要该ID,身份验证由自定义操作筛选器处理。我可以将设备ID作为路由参数传递,但它将是redundantCheck FromHeaderAttribute,但也会检查重复项。HttpContext现在可以通过配置注入。我建议您编辑您的问题,以准确指定您想要的内容(访问标题字段以识别移动设备)。ASP.NET文档似乎正在经历。。。。“过渡期”是一个善意的说法,文档页面缺失。检查询问如何路由移动设备在我的例子IIRC中,要求将其包含在http头中,因为需要在.net核心中间件组件完美示例中评估相同的值
[TestMethod]
public void TestValuesController()
{
    ValuesController controller = new ValuesController();
    var result = controller.GetHeaderValue("27");
    Assert.AreEqual(result, "27");
}
public class ValuesController: Controller
{
    public string GetHeaderValue([FromHeader(Name = "device-id")] string id)
    {
        return id;
    }
}