Я думаю, вам нужно задать вопрос что вы тестируете? В вашем тестовом примере вы только проверяете, возвращает ли SUT
employee
, возвращенное service
;ИМО не имеет значения, является ли это тем же экземпляром. Обновление свойства не должно нарушать этот тест.
Вы затрагиваете более широкую проблему, хотя в других случаях вы действительно хотите сравнить expected
с actual
по structural equality
в этом случае вы могли бы (используя, например, xUnit
s MemberData
) использовать builder
, который генерирует два экземпляра, когда вы вызываете его дважды:
var employee = new EmployeeModelBuilder().Build();
Такой конструктор может быть улучшен с помощью With()
методов:
var employee = new EmployeeModelBuilder().With(name: "John").Build();
Или вы можете просто встроить создание этих объектов, используя new EmployeeModel {}
.
Структурное равенство означает, что вам нужен объект, который переопределяет Equality
членов или использоватьIEqualityComparer<>
в ваших утверждениях.
Обновление
Если вы не хотите использовать пользовательские компоновщики (как вы говорите), вы можете указать AutoFixture
для создания объектов с помощьюконкретные свойства устанавливаются со значениями. Если затем вы попросите его создать экземпляр дважды (один раз для вашего expected
и один раз для экземпляра, возвращенного службой, введенной в ваш SUT
), вы можете сравнить expected
с actual
в вашей Assert
фазе.
[Fact]
public void Sut_ReturnsEmployee_FromService()
{
var fixture = new Fixture();
fixture.Customize<EmployeeModel>(e => e.With(x => x.Name, "Foo"));
var expected = fixture.Create<EmployeeModel>();
var foundEmployee = fixture.Create<EmployeeModel>();
var employeeServiceMock = new Mock<IEmployeeService>();
employeeServiceMock.Setup(f => f.GetEmployeeById(42)).Returns(foundEmployee);
var sut = new EmployeeController(employeeServiceMock.Object);
var actual = sut.GetEmployeeById(42);
Assert.Equal(expected.Name, actual.Name);
}
Здесь я использовал [Fact]
, и утверждение сравнивает два конкретных свойства на равенство, но когда вы сравниваете структурное равенство, вы можете просто сравнить сами объекты (как упомянуто выше). Теперь вы можете проверить, что ваш SUT
возвращает ожидаемый экземпляр без изменения и без использования двух ссылок на один и тот же экземпляр.