Пожалуйста, взгляните на следующий образец:
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);
Но это не поддерживается по умолчанию.
Итак, как мне решить эту проблему. Спасибо.