【发布时间】:2016-07-05 10:32:10
【问题描述】:
请看以下示例:
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 比较参数,并且由于我通常无法控制传递给该方法的数据,因此对象(数据和预期结果)永远不会引用同一个对象。
但是,有一种方法可以让它工作,那就是如果我覆盖 Equals,就像这样:
public override bool Equals(object obj)
{
return this.A.Equals((obj as DomainClass).A);
}
public override int GetHashCode()
{
return this.A.GetHashCode();
}
这可行,但我不想实现 Equals 来满足测试,因为它会产生各种其他含义,这里不值一提。
我想要的是一个比较器在第二个断言行中做同样的事情:
data.ShouldBeEquivalentTo(expectedResult);
但默认情况下不支持此功能。
那么,我该如何解决这个问题。 谢谢。
【问题讨论】:
标签: .net unit-testing nsubstitute