C# 在.NET内核中模拟HttpContext.Session
我正在使用xUnit和Moq为我的应用程序编写单元测试。 然而,我很难嘲笑这次会议 被测系统是一个控制器动作,被测方法使用一个C# 在.NET内核中模拟HttpContext.Session,c#,.net,unit-testing,asp.net-core,C#,.net,Unit Testing,Asp.net Core,我正在使用xUnit和Moq为我的应用程序编写单元测试。 然而,我很难嘲笑这次会议 被测系统是一个控制器动作,被测方法使用一个TempData[“UserMessage”],它始终为空,因为会话未初始化 这是一个打印屏幕,显示了我是如何模拟依赖关系的。 抛出的错误位于第65行,并在后面 一般的经验法则是避免使用“脂肪控制器”。我的控制器实际上具有针对相应服务执行所需的模型或参数。理想情况下,您的控制器操作是一个具有许多描述端点的属性的单个调用,请考虑以下内容: public class MyT
TempData[“UserMessage”]
,它始终为空,因为会话未初始化
这是一个打印屏幕,显示了我是如何模拟依赖关系的。
抛出的错误位于第65行,并在后面
一般的经验法则是避免使用“脂肪控制器”。我的控制器实际上具有针对相应服务执行所需的模型或参数。理想情况下,您的控制器操作是一个具有许多描述端点的属性的单个调用,请考虑以下内容:
public class MyThinController : Controller
{
[
HttpGet,
Route("api/[controller]/foos/{bar}"),
Authorize(Policy = nameof(Policies.StackoverflowOp))
]
public Task<IActionResult> GetFoo([FromRoute] Bar bar,
[FromServices] IExampleService service)
=> service.GetAsync(bar);
}
公共类控制器:控制器
{
[
HttpGet,
路由(“api/[controller]/foos/{bar}”),
授权(Policy=nameof(Policies.StackoverflowOp))
]
公共任务GetFoo([FromRoute]栏,
[FromServices]IExampleService(服务)
=>service.GetAsync(bar);
}
然后,您唯一关心的应该是,给定一个条
,IExampleService
的实现是否正确地得到了一个Foo
但是,如果你完全不愿意用正确的方法去做,那么总有一种方法是错误的。实际上,您正在寻找moq就绪的
ActionContext.HttpContext
。控制器应该是哑的,您应该有一个服务并测试它们。我确实有存储逻辑的服务。你是说一个人根本不应该测试它?我的目的是测试它在发送错误/正确值时是否返回正确的usermessage。您只是测试框架是否正常工作,我通常会尝试避免这种情况。我正在尝试消化您编写的内容,但我不明白为什么我不应该测试我们的操作是否以正确的顺序进行各种服务方法调用等。您是否有任何与您的建议相关的链接?我真的很想知道他们应该有多瘦/多笨。抱歉耽搁了。。。汉克斯·大卫回答说,这很有道理:)