0

所以这变得很痛苦。我正在尝试测试一些 Microsoft 的垃圾成员库,它们太糟糕了。我设法在 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"] 
4

1 回答 1

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;

无论如何——呸!

于 2012-07-17T02:08:58.017 回答