0

因此,由于 MS 的所有愚蠢的静态方法,在 MVC 中进行测试是一件很痛苦的事情,但我已经能够解决其中的一些问题——我为成员资格创建了一个接口,以便我可以模拟它,并且大部分工作但我正在使用 ProfileBase在我的自定义 UserProfile 对象中,这当然要困难得多,因为它也有静态方法并且它继承自 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() 是静态的。呃!太白痴了!

无论如何 - 这是我卡住的地方 - 我需要用一种方法来做到这一点。

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

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

有人有什么建议吗?

4

1 回答 1

2

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

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

我曾经担心这样的问题,但现在我什至不费吹灰之力,只需围绕任何 .NET 的疯狂密封类和静态方法等创建包装类。

于 2012-07-16T05:05:13.823 回答