请看看下面的示例:NSubstitute,声称收到的调用,参数比较使用object.ReferenceEquals
public interface IDomainClass
{
int A { get; set; }
void CalledMethod(IDomainClass data);
}
public class DomainClass : IDomainClass
{
public int A { get; set; }
public void CalledMethod(IDomainClass data)
{
throw new NotImplementedException();
}
}
而且下面的测试:
[Test]
public void TestSample()
{
//Arrange
IDomainClass testingClass = Substitute.For<IDomainClass>();
IDomainClass data = new DomainClass() { A = 123, };
IDomainClass expectedResult = new DomainClass() { A = 123, };
//Act
testingClass.CalledMethod(data);
//Assert
testingClass.ReceivedWithAnyArgs(1).CalledMethod(null); //ok
data.ShouldBeEquivalentTo(expectedResult); //ok
testingClass.Received(1).CalledMethod(expectedResult); //fail
}
的问题是,我不知道如何测试接收到的呼叫中的参数(CallMethod)。实际上,使用第一个object.ReferenceEquals和object.Equals来比较参数,并且由于我通常无法控制传递给方法的数据,因此对象(data和expectedResult)从不会引用同一个对象。
然而,有一种方法,使其工作,那就是如果我重载Equals,像这样:
public override bool Equals(object obj)
{
return this.A.Equals((obj as DomainClass).A);
}
public override int GetHashCode()
{
return this.A.GetHashCode();
}
这是可行的,但我不希望实现等于满足检验因为它会有所有其他的暗示在这里不值得一提。
我要的是一个比较器做同样的一个第二断言行:
data.ShouldBeEquivalentTo(expectedResult);
但这不是每默认支持。
那么,我该如何解决这个问题。 谢谢。
嗯,我同意,错误信息并不美观,但它是一个解决方法,现在会做,直到一个更好的实现发布... –