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



我正在使用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进行编码,并且我有一个继承了ApiControllerBaseController
好的,在ApiController中,我们有一个IPrincipal User属性,我用ICustomPrinciple实现(此链接(覆盖了它
现在我想以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);

任何帮助都将不胜感激。

要使mock工作,它需要virtual属性,在继承的情况下,该属性不存在于基类中(没有歧义(

因此,您可以按照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!

为什么要更改或强制隐藏基类型,这就是这里的问题所在。如果您想定义一个返回单独类型的单独成员,那么按照下面的方式执行,现在当您说child.SetupGet(x => x.User1).Returns(user.Object);时,您的mock不应该抱怨任何事情。您正在将属性的类型从User更改为Customuser,而这两个实体之间没有相似性。

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

最新更新