【问题标题】:Problems with contains when using moq使用起订量时包含的问题
【发布时间】:2011-10-17 07:25:23
【问题描述】:

我想测试一个删除方法。 delete 方法在模拟服务中调用(不使用 moq 模拟)。

服务管理对象列表。对象的类派生自覆盖 equals() 的基类。

 public override bool Equals(object obj) {
        if (obj == null || GetType() != obj.GetType()) {
            return false;
        }

        BaseClass testObj = (BaseClass)obj;
        return BusinessId.Equals(testObj.BusinessId);

    }

当我打电话时

 serive.GetAll().Contains(objectInList);

我错了。

未调用基类中的 Equals 方法。 列表中的对象是用 moq 模拟的。

 Mock<TypeOfObject> objectMock = new Mock<TypeOfObject>();
 objectMock.SetupGet(pf => pf.BusinessId).Returns(guid);
 return objectMock.Object;

如何设置基类的 Equals-Methode 被调用并且 Contains-method 返回 true 的模拟?

提前致谢。

【问题讨论】:

  • 这行不通? objectMock .Setup(a => a.Equals("something")).Returns(true);
  • 但是对于 equals 和 contains,我总是正确的?
  • @Tobias,不要忘记覆盖GetHashCodeEquals!它可能不会解决这个问题,但它可能会阻止更多的问题。

标签: c# moq equals contains


【解决方案1】:

您可以通过将 Mock.CallBase 属性设置为 true 来使模拟调用您的 Equals 方法,例如:

Mock<TypeOfObject> objectMock = new Mock<TypeOfObject>(); objectMock.SetupGet(pf => pf.BusinessId).Returns(guid); objectMock.CallBase = true; return objectMock.Object;

【讨论】:

    【解决方案2】:

    由于您的 GetType() 检查而失败。您传递的对象是Mock,而不是BaseClass

    试试这个:

    public override bool Equals(object obj)
    {
        if (obj != null && obj is BaseClass)
        {
            return BusinessId.Equals((obj as BaseClass).BusinessId);
        }
        else
        {
            return false;
        }
    }
    

    【讨论】:

    • 我经常看到这种情况,当您进行is 检查时,为什么不直接使用更快的(BaseClass)objas 在内部可以被认为是在执行以下操作:obj is T? (T)obj : default(T)。因此,在is 中使用as 似乎毫无意义。
    • 如果类型转换无效,显式类型转换(BaseClass)obj 会抛出异常,而isas 则不会。但是您通常可以通过(仅)执行as 并检查null 返回来避免同时执行is+cast。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多