【问题标题】:Ambiguous match found exception in using Moq-Mock library在使用 Moq-Mock 库时发现模棱两可的匹配异常
【发布时间】:2018-11-22 11:46:59
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

  • 这些类显示糟糕的设计让我相信这是一个XY problem。为什么Father 更改基本属性? (解释一下,这样我才能更好地理解你想要做什么)。测试某些东西的困难通常表明原始设计存在问题
  • @Nkosi 帖子已更新。
  • 应该永远不需要模拟控制器。你到底想达到什么目的?您应该能够创建控制器实例并设置用户。
  • @Nkosi 如果我有一个从请求或其他来源获取一些数据的getter 属性,那么我有更多问题。
  • 这就是为什么您应该向我们展示您实际尝试做的事情,以便我们了解实际问题。

标签: c# inheritance mocking moq ambiguous


【解决方案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!

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-08-04
      • 2015-11-25
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 1970-01-01
      • 2010-11-13
      相关资源
      最近更新 更多