[英]How can use Microsoft Fakes to mock User.Identity.Name
使用Visual Studio 2012对MVC 4应用程序进行单元测试时,如何使用Microsoft Fakes来模拟User.Identity.Name。我正在为项目创建操作方法编写单元测试。
[HttpPost]
public ActionResult Create([Bind(Include = "Name")]Category category)
{
if (categoryService.IsNameExists(category.Name))
{
ModelState.AddModelError("Name", "Category name already exists!");
return View(category);
}
try
{
if (ModelState.IsValid)
{
UserProfile p = new UserProfile();
p.UserName = User.Identity.Name;
category.CreatedBy = p;
category.CreatedDate = DateTime.Now;
category.Active = true;
category.DeletedBy = null;
category = categoryService.SaveCategory(category);
return RedirectToAction("Index");
}
return View(category);
}
catch (DataException dex)
{
}
}
[TestMethod]
public void Create()
{
Category createdCategory = new Category();
ICategoryService service = new StubICategoryService()
{
SaveCategoryCategory = (category) => { return category; }
};
CategoryController controller = new CategoryController(service);
using (ShimsContext.Create())
{
System.Fakes.ShimDateTime.NowGet = () =>
{ return new DateTime(2000, 1, 1); };
ViewResult result = controller.Create(createdCategory) as ViewResult;
Assert.IsNotNull(result);
}
}
这些是我编写的动作方法和测试方法。 如果除了MS Fakes之外还有其他更好的方法,请告诉我(而不是其他模拟框架)。
假设您已经为System.Web
和System
添加了Fakes引用,则可以在using (ShimsContext.Create())
块内执行以下操作:
var context = new System.Web.Fakes.ShimHttpContext();
var user = new StubIPrincipal
{
IdentityGet = () =>
{
var identity = new StubIIdentity {NameGet = () => "foo"};
return identity;
}
};
context.UserGet = () => principal;
System.Web.Fakes.ShimHttpContext.CurrentGet = () => { return context; };
User
实际上是HttpContext.User
。 因此,您可以使用System.Fakes.ShimHttpContext返回包含正确的Identity.Name的整个IPrincipal
的自定义实现。
我最终得到了与@Sven类似的答案,但最终却对上下文进行了存根,而不是使用填充程序。
using (AccountController controller = new AccountController())
{
StubHttpContextBase stubHttpContext = new StubHttpContextBase();
controller.ControllerContext = new ControllerContext(stubHttpContext, new RouteData(), controller);
StubIPrincipal principal = new StubIPrincipal();
principal.IdentityGet = () =>
{
return new StubIIdentity
{
NameGet = () => "bob"
};
};
stubHttpContext.UserGet = () => principal;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.