简单.使用自定义对象调用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
, Equals
和GetHashCode
没有成功。什么好主意吗?
如果期望的结果是验证输入,您可以尝试使用谓词
指定期望。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);
}
}