是否有更好的模式来实现使用profilebase的类?

时间:2012-07-16 02:46:03

标签: asp.net-mvc unit-testing

因此,在MVC中进行测试是一个痛苦的因为所有MS的Stupid静态方法,但我已经能够解决其中的一些问题 - 我创建了一个成员接口,以便我可以模拟它,这大部分都有效,但我我在我的自定义UserProfile对象中使用ProfileBase,这当然要困难得多,因为它也有静态方法,并且它继承自ProfileBase。我浪费了整个星期天,无法弄清楚如何测试这个。

这是我的UserPofile类的样子 - 它实际上与所有在线示例相同。

namespace TaskBoardAuth.Models
{
    public class UserProfile: ProfileBase
    {
        public static UserProfile GetUserProfile(string username)
        {
            return Create(username) as UserProfile;
        }

        public static UserProfile GetUserProfile()
        {
            return Create(Membership.GetUser().UserName) as UserProfile;
        }

        [SettingsAllowAnonymous(false)]
        public string FirstName
        {
            get { return base["FirstName"] as string; }
            set { base["FirstName"] = value; }
        }

        [SettingsAllowAnonymous(false)]
        public string LastName
        {
            get { return base["LastName"] as string; }
            set { base["LastName"] = value; }
        }

    }
}

问题是我无法测试因为那两个愚蠢的蹩脚静态方法,不要介意profileBase.Create()是静态的。呃!那么asinine!

无论如何 - 这就是我被困的地方 - 我需要在方法中做到这一点。

taskBoardModel.Name = UserProfile.GetUserProfile().FirstName + " " + UserProfile.GetUserProfile().LastName;

我的单元测试当然会爆炸,因为对Membership.GetUser()的调用失败了!呃!!!

有人有什么建议吗?

1 个答案:

答案 0 :(得分:2)

当处理任何框架问题时,例如这个MVC,我通常会创建一个包装类和一个围绕内部类的附带接口,我可能需要测试/模拟。然后我配置我的IoC容器以向控制器的构造函数注入我的IUserProfile接口。所以在我的单元测试中,我只是模拟我的IUserProfile并提供我想要的任何数据。

可以通过创建包装类和接口以相同的方式解决Membership.GetUser()问题。

我过去常担心这样的问题,但现在我甚至没有出汗,只是围绕任何.NET的疯狂密封类和静态方法等创建包装类。