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