Я пытаюсь создать несколько модульных тестов для приложения, которое я недавно унаследовал. В настоящее время использую NSubstitute, потому что его использовал предыдущий программист, но я к нему не привязан.
Тестируемый метод вызывает метод Create класса DataService.
Вызов метода создания
var contactProductLink = this.dsService.Create<ContactProductLink>(x =>
{
x.ContactRoleId = prod.RoleId;
x.ContactId = contactViewModel.ContactId;
x.ProductId = prod.ProductId;
x.Active = true;
x.InsertDate = DateTime.Now;
x.InsertUserId = user.employeeId;
x.UpdateDate = DateTime.Now;
x.UpdateUserId = user.employeeId;
});
Метод создания DataService:
public TEntity Create<TEntity>(Action<TEntity> propertySetter = null) where TEntity : class
{
var tEntity = this.Context.Create<TEntity>();
if (propertySetter != null)
{
propertySetter(tEntity);
}
return tEntity;
}
Подход, который я выбрал (и, возможно, есть лучший способ), заключается в использовании NSubstitute для имитации DataService. Когда я делаю свои утверждения в конце, я проверяю, был ли вызван метод Create:
mockDataSupplierService.Received().Create<ContactProductLink>(Arg.Any<Action<ContactProductLink>>());
Однако я хотел бы также проверить правильность ввода, отправленного методу, и здесь у меня возникают проблемы. Я могу получить объект System.Action, который был передан методу Create, но я не могу понять, как извлечь параметры (такие как ContactRoleId, ContactId и т. д., как указано во фрагменте кода вызывающего метода create).
Итак, после всего этого я спрашиваю:
- Как я могу получить доступ к этим входным параметрам, чтобы убедиться, что в службу данных передаются правильные аргументы? Это вообще возможно?
- Есть ли лучший способ сделать это, чем то, что я сейчас пытаюсь сделать?
Решение
//Arrange
mockDataSupplierService.Create<ContactProductLink>(Arg.Do<Action<ContactProductLink>>(x=> actionToPopulateEntity = x));
//Assert
mockDataSupplierService.Received().Create<ContactProductLink>(Arg.Any<Action<ContactProductLink>>());
var entity = new ContactProductLink();
actionToPopulateEntity.Invoke(entity);
Assert.AreEqual(ExpectedContactId, entity.ContactId);