【发布时间】:2009-10-09 22:55:44
【问题描述】:
作为单元测试的一部分,我试图模拟 FormsIdentity.Ticket.UserData 的返回值
以下内容将不起作用,但它应该让我知道我正在尝试做什么:
var principal = Mock<IPrincipal>();
var formsIdentity = Mock<FormsIdentity>();
formsIdentity.Setup(a => a.Ticket.UserData).Returns("aaa | bbb | ccc");
principal.Setup(b => b.Identity).Returns(formsIdentity.Object);
我要测试的代码如下所示:
FormsIdentity fIdentity = HttpContext.Current.User.Identity as FormsIdentity;
string userData = fIdentity.Ticket.UserData;
我想要在单元测试中做的只是伪造 FormsIdentity.Ticket.UserData 的返回值。但是,当我在第一部分运行代码时,在尝试模拟 FormsIdentity 时出现错误。错误说要模拟的类型必须是接口、抽象类或非密封类。
我尝试使用 IIdentity 而不是 FormsIdentity(FormsIdentity 是 IIdentity 的实现),但 IIdentity 没有 .Ticket.UserData。
那么我该如何编写这个测试以便从 FormsIdentity.Ticket.UserData 中获取一个值?
【问题讨论】:
-
原来我试图测试的方法做得太多了。它违反了单一责任模式,这使得测试变得困难。我已经重构了这个方法。至于原始问题 - 似乎没有任何方法可以模拟 FormsIdentity.Ticket.UserData 因为它是密封类的一部分
标签: asp.net-mvc tdd mocking moq