我目前正在开发一个使用默认SqlMembershipProvider进行身份验证的asp.net MVC2应用程序。我已经实现了一个控制器方法,它通过调用Membership.GetUser().ProviderUserKey读取当前用户的ProviderUserKey。现在,我正在尝试为这个控制器编写一些测试方法。
为了摆脱对静态成员关系类的依赖,我创建了一个瘦包装器,并使我的控制器依赖于相应的接口:
public interface IStaticMembershipService {
MembershipUser GetUser();
void UpdateUser(MembershipUser user);
}到目前为止,一切都正常,但是为了对控制器进行单元测试,我仍然需要模拟该接口的GetUser()方法,并返回一个包含ProviderUserKey属性的MembershipUser对象。模拟这样的对象最简单的方法是什么?
我使用moq作为模拟框架。
发布于 2010-11-23 23:55:29
它看起来像这样:
var membershipMock = new Mock<IStaticMembershipService>();
var userMock = new Mock<MembershipUser>();
userMock.Setup(u => u.ProviderUserKey).Returns(guid);
membershipMock.Setup(s => s.GetUser()).Returns(userMock.Object);如果MembershipUser类不适合模拟(即如果ProviderUserKey不是虚拟的),那么您将需要创建自己的对象来表示MembershipUser对象中需要的值,并让您的服务返回其中一个值。
还有可能MembershipUser是一个类似poco的对象,您可以像这样创建一个实例:
var userMock = new MembershipUser {ProviderUserKey = guid};发布于 2010-11-23 23:56:58
我认为你需要将你的实现细节与消费者真正关心的接口分开。我不确定你的控件需要ProviderUserKey做什么,如果它将它转换成一个特定的类,等等,但我会考虑让你的接口真正满足控制器的需求,而不是反过来。类似于(不知道更多细节):
public interface IMembershipDetailsService {
Guid UserKey { get; }
}一旦你完成了这个级别的抽象,那么模仿就会变得容易得多,因为你可以这样做:
membershipService.Setup (svc => svc.UserKey).Returns (myGuid);这只是另一种想法,而不是试图返回整个MembershipUser对象,您需要进一步的存根。
发布于 2010-11-23 23:54:15
类似于下面的内容:
var user = new MembershipUser();
var membershipService = new Mock<IStaticMembershipService>();
membershipService.Setup(p => p.GetUser()).Returns(user);https://stackoverflow.com/questions/4257793
复制相似问题