我正在使用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);
任何帮助将不胜感激。
答案 0 :(得分:1)
为什么要更改或强制隐藏基本类型,这就是这里的问题。如果您想定义一个返回单独类型的单独成员,请按照下面的步骤进行操作,现在,当您说child.SetupGet(x => x.User1).Returns(user.Object);
时,您的模拟应该不抱怨任何东西。您正在将属性的类型从User
更改为Customuser
,并且这两个实体之间没有相似之处。
public class Father : BaseClass
{
public virtual CustomUser User1 { get; set; }
}
答案 1 :(得分:1)
要使模拟程序正常工作,它需要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!