を使用して比較された受信通話を、上の主張は、次のサンプルをご覧ください: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)は同じオブジェクトを参照しません。
しかし、そこにそれを動作させるための方法である、と私は対等をオーバーライドする場合には、次のように:
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);
しかし、これはデフォルトごとにサポートされていません。
この問題を解決するにはどうすればよいですか。 ありがとうございます。
さて、私は同意します。エラーメッセージはきれいではありませんが、回避策があります。 –