简单.使用自定义对象调用mock Expect方法

本文关键字:mock Expect 方法 调用 对象 自定义 简单 | 更新日期: 2023-09-27 18:15:27

所以我使用Simple。在我的测试中模拟一些接口。一些方法接收自定义对象

public class MyObj
{
    public int Attr { get; set; }
    public override bool Equals(object obj)
    {
        return Equals(obj as MyObj);
    }
    public override int GetHashCode()
    {
        return Attr;
    }
    private bool Equals(MyObj myObj)
    {
        return Attr == myObj.Attr;
    }
}
public interface IFoo
{
    void Show(MyObj o);
}
public class ObjUnderTest
{
    public ObjUnderTest(IFoo foo)
    {
        var o = new MyObj{ Attr = 1; };
        foo.Show(o);
    }
}
[TestClass]
public class TestClasse
{
    [TestMethod]
    public void TestShow()
    {
        var foo = Mock.Interface<IFoo>();
        var myObj = new MyObj { Attr = 1 };
        Expect.Once.MethodCall(() => foo.Show(myObj));
        var objectUnderTest = new ObjUnderTest(foo);
        AssertExpectations.IsMetFor(foo);
    }
}

问题是测试总是失败,即使Show是用一个Attr等于1的对象调用的。只有当我像这样写expect时,它才会通过:

Expect.Once.MethodCall(()=> foo.Show(Any<MyObj>.Value));

这不是我需要的。我知道它失败了,因为那些是不同的对象,但我已经尝试覆盖MyObj, EqualsGetHashCode没有成功。什么好主意吗?

简单.使用自定义对象调用mock Expect方法

如果期望的结果是验证输入,您可以尝试使用谓词

指定期望。
Expect.Once.MethodCall(()=> foo.Show(Any<MyObj>.Value.Matching(obj => obj.Attr == 1)));

Source: project readme on Github - Using "通配符"参数值

[TestClass]
public class TestClasse {
    [TestMethod]
    public void TestShow() {
        //Arrange
        var foo = Mock.Interface<IFoo>();
        Expect.Once.MethodCall(()=> foo.Show(Any<MyObj>.Value.Matching(obj => obj.Attr == 1)));
        //Act
        var objectUnderTest = new ObjUnderTest(foo);
        //Assert
        AssertExpectations.IsMetFor(foo);
    }
}