Пожалуйста, обратите внимание на следующий пример: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). Как бы то ни было, аргументы сравниваются с использованием первого объекта .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();
}
Это будет работать, но я не хочу, чтобы реализовать Equals, чтобы удовлетворить тест так как у него будут все другие последствия, о которых здесь не стоит упоминать.
То, что я хочу, сравнивающий делать то же самое на второй линии Assert:
data.ShouldBeEquivalentTo(expectedResult);
Но это не поддерживается по-умолчанию.
Итак, как решить эту проблему. Спасибо.
Ну, я согласен, сообщение об ошибке не очень красивое, но это обход и будет делать пока пока не будет выпущена лучшая реализация ... –