請看看下面的示例: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);
但這不是每默認支持。
那麼,我該如何解決這個問題。 謝謝。
嗯,我同意,錯誤信息並不美觀,但它是一個解決方法,現在會做,直到一個更好的實現發佈... –