首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模拟MembershipUser

模拟MembershipUser
EN

Stack Overflow用户
提问于 2010-11-23 23:37:52
回答 4查看 4K关注 0票数 10

我目前正在开发一个使用默认SqlMembershipProvider进行身份验证的asp.net MVC2应用程序。我已经实现了一个控制器方法,它通过调用Membership.GetUser().ProviderUserKey读取当前用户的ProviderUserKey。现在,我正在尝试为这个控制器编写一些测试方法。

为了摆脱对静态成员关系类的依赖,我创建了一个瘦包装器,并使我的控制器依赖于相应的接口:

代码语言:javascript
复制
public interface IStaticMembershipService {
    MembershipUser GetUser();

    void UpdateUser(MembershipUser user);
}

到目前为止,一切都正常,但是为了对控制器进行单元测试,我仍然需要模拟该接口的GetUser()方法,并返回一个包含ProviderUserKey属性的MembershipUser对象。模拟这样的对象最简单的方法是什么?

我使用moq作为模拟框架。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-23 23:55:29

它看起来像这样:

代码语言:javascript
复制
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的对象,您可以像这样创建一个实例:

代码语言:javascript
复制
var userMock = new MembershipUser {ProviderUserKey = guid};
票数 12
EN

Stack Overflow用户

发布于 2010-11-23 23:56:58

我认为你需要将你的实现细节与消费者真正关心的接口分开。我不确定你的控件需要ProviderUserKey做什么,如果它将它转换成一个特定的类,等等,但我会考虑让你的接口真正满足控制器的需求,而不是反过来。类似于(不知道更多细节):

代码语言:javascript
复制
public interface IMembershipDetailsService {
    Guid UserKey { get; }
}

一旦你完成了这个级别的抽象,那么模仿就会变得容易得多,因为你可以这样做:

代码语言:javascript
复制
membershipService.Setup (svc => svc.UserKey).Returns (myGuid);

这只是另一种想法,而不是试图返回整个MembershipUser对象,您需要进一步的存根。

票数 2
EN

Stack Overflow用户

发布于 2010-11-23 23:54:15

类似于下面的内容:

代码语言:javascript
复制
var user = new MembershipUser();
var membershipService = new Mock<IStaticMembershipService>();
membershipService.Setup(p => p.GetUser()).Returns(user);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4257793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档