使用Moq-Mock库时发现歧义匹配异常

时间:2018-11-22 11:47:00

标签: c# inheritance mocking moq ambiguous

我正在使用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);

任何帮助将不胜感激。

2 个答案:

答案 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!