【发布时间】:2018-04-04 13:55:28
【问题描述】:
我首先要说我对单元测试相当陌生,但我现在是一个坚定的信徒。我以前的工作总是有一个测试员,所以我从来不用担心这个。
我有一个正在替换 Web 服务的 ASP.Net MVC API。 API 从 Web 应用程序获取 HTTP Post,将请求记录到该数据库,然后发出请求并从另一个数据库返回数据。它正在替换的 Web 服务具有额外的开销,以确保随请求提交的用户名是登录用户。为了替换它,我使用了站点身份验证和关联控制器的 User.Identity 对象。
现在我需要为此编写一个单元测试。我可以使用 Moq 为 MVC 控制器模拟经过身份验证的用户,但似乎找不到如何为 API 模拟经过身份验证的用户。这是我想要做的:
... // In the test method
DbApiController controller = new DbApiController ();
controller.ControllerContext = GetMockContext();
...
private HttpControllerContext GetMockContext()
{
var identity = new GenericIdentity("testuser");
var controllerContext = new Mock<HttpControllerContext>();
var principal = new Mock<IPrincipal>();
principal.Setup(p => p.IsInRole("SalesAndEstimating"));
principal.SetupGet(p => p.Identity.Name).Returns("testuser");
controllerContext.SetupGet(c => c.RequestContext.Principal).Returns(principal.Object);
return controllerContext.Object;
}
我遇到了异常:
System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member: mock => mock.RequestContext
我在这里做错了什么?
更新代码:
ApiController controller = new DbApiController();
var context = new Mock<HttpContextBase>();
var identity = new GenericIdentity("testuser");
identity.AddClaim(new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", "1"));
var principal = new GenericPrincipal(identity, new[] { "user" });
context.Setup(s => s.User).Returns(principal);
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
var results = ((DbApiController)controller).Post(...);
Assert.AreEqual(results.Success, true);
进行上述更改后,我仍然收到错误“参数 3:无法从 'System.Web.Http.ApiController' 转换为 'System.Web.Mvc.ControllerBase'”。
【问题讨论】:
标签: c# unit-testing asp.net-web-api