从ProfileBase模拟属性

时间:2012-07-17 01:22:23

标签: c# asp.net-mvc mocking

所以这变得很悲惨。我正在尝试测试一些微软的垃圾会员库,它们真的很糟糕。我设法将一个接口放在Membership类的前面,然后遇到我的类实现ProfileBase的问题,我设法为它创建了一个接口,因此可以模拟愚蠢的静态create方法但是如何模拟profileBase中的属性这是你使用那个愚蠢的类的唯一原因。认真的MicroSoft在这个时代无法修复他们的代码,所以你可以为它编写一个怪异的单元测试。多么可怜。这是我到目前为止所尝试的

mockProfileFactoryService = new Mock<IProfileFactoryService>();
mockProfileFactoryService.Setup(x => x.GetUserProfile(It.IsAny<string>())).Returns(new DummyUserProfile(){FirstName = ""});   

这就是虚拟课的样子

public class DummyUserProfile: UserProfile
{
    public new String FirstName { get; set; }
    public new String LastName { get; set; }
}

我以为我可以隐藏属性FirstName和LastName,但是测试刚刚爆发,我可以看到它试图访问实际UserProfile类中的属性。

有谁知道我怎么做到这一点?说真的 - 当他们从ProfilBase类继承时,其他人在做什么?

我也尝试使用reshaper进行提取和界面,这似乎有效,但是当我嘲笑它然后试图说.Return(profileMock.object)它爆炸说它无法转换和IUserProfile到UserProfile?在ARG之前我还没见过!!!

我的意思是 - 我讨厌更改我的代码以使其可测试,即检查空值或愚蠢的废话,但我会尽可能,在这种情况下你不能做任何事情,因为你怎么办?

base["FirstName"] 

1 个答案:

答案 0 :(得分:0)

所以经过一次好的咆哮后,我在我的IProfileFacotryService

中提出了这个问题
string GetPropertyValue(string userName, string propertyName);

然后在实施中

public string GetPropertyValue(string userName, string propertyName)
{
    return (string)GetUserProfile(userName).GetPropertyValue(propertyName);
}

但是我对此并不感到兴奋 - 我一般不喜欢创建除了调用原始代码之外的其他任何东西的界面,我觉得这不是真的那样 - 我的意思是,但是意义似乎不太清楚我?无论如何 - 我只是觉得有一种更好的方法可以做到这一点,所以当这个工作时我不介意一个更好的解决方案,如果存在。

显然我现在可以嘲笑这个但是在我的代码中我不得不说

taskBoardModel.Name = profileFactoryService.GetPropertyValue(userName, "FirstName");

我宁愿说

 taskBoardModel.Name = profileFactoryService.GetUserProfile(userName).FirstName;

无论如何 - bah欺骗!