在使用 Moq-Mock 库时发现不明确的匹配异常

Ambiguous match found exception in using Moq-Mock library

我正在使用 Moq,我意识到在这种情况下我得到了 Ambiguous match found 异常,我需要帮助:

这是我的模型:

public class User
{
}

public class CustomUser
{
}

一些类:

public class BaseClass
{
    public virtual User User { get; set; }
}

public class Father : BaseClass
{
    public virtual new CustomUser User { get; set; }
}

public class Child : Father
{
}

最后:

void Main()
{
    var user = new Mock<CustomUser>();
    var child = new Mock<Child>();
    child.SetupGet(x=>x.User).Returns (user.Object);  // Ambiguous match found.
}

更新:
我为什么要用这个?! 因为我正在编码 MVC-WebAPI 并且我有一个 BaseController 继承了 ApiController.
好的,在 ApiController 中,我们有一个 IPrincipal User 属性,我用 ICustomPrinciple 实现 (this link).
覆盖了它 现在我想模拟 ProductController : BaseController.

var controller = new Mock<ProductController>();
var user = new Mock<CustomPrincipal>();

user.SetupGet(x => x.FullName).Returns("some full name");

controller.SetupGet(x => x.UserRoleID).Returns(81);// UserRoleID is getter and I do some stuff here.
controller.SetupGet(x => x.User).Returns(user.Object);

任何帮助将不胜感激。

为什么要更改或强行隐藏基类型,这就是问题所在。如果你想定义一个单独的成员返回单独的类型,那么像下面那样做,现在当你说 child.SetupGet(x => x.User1).Returns(user.Object); 时你的模拟不应该抱怨任何东西。您正在将 属性 的类型从 User 更改为 Customuser 并且这两个实体之间没有相似性。

public class Father : BaseClass
{
    public virtual CustomUser User1 { get; set; }
}

要使 mock 工作,它需要 virtual 属性 以防继承在基 class 中不存在(没有歧义)

因此您可以按照 Rahul 的建议重命名 属性 或更改 BaseClass 以包含通用 属性:

public class BaseClass<TUser>
{
    public virtual TUser User { get; set; }
}

public class Father : BaseClass<CustomUser>
{
}

...
child.SetupGet(x=>x.User).Returns (user.Object);  // Works!