我目前正在开发一个使用默认sqlmembershipprovider进行身份验证的asp.net mvc 2应用程序。我实现了一个控制器方法,通过调用Membership.GetUser().ProviderUserKey,读取当前用户的provideruserkey。
现在我试图为这个控制器编写一些测试方法。
为了消除对静态成员类的依赖性,我创建了一个瘦包装器,并使我的控制器依赖于相应的接口:

public interface IStaticMembershipService {
    MembershipUser GetUser();

    void UpdateUser(MembershipUser user);
}

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

最佳答案

看起来像这样:

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};

08-18 22:11