#c# #unit-testing #asp.net-core #moq #xunit
Вопрос:
public class Details
{
public int Id { get; internal set; }
public string Name { get; set; }
}
У меня есть задача, в которой у задатчика в модели есть внутренний атрибут, и я попытался добавить такие вещи, как
[assembly: InternalsVisibleTo("sometestrepo")]
по классу моделей, но безрезультатно. Я гуглил пару часов и, похоже, не могу найти ответа. Возможно ли вообще протестировать его xunit или создать макет и объект, чтобы он позволил создать объект с идентификатором. В противном случае, как еще я должен полностью протестировать методы CRUD, которые основаны на параметре ID?
Комментарии:
1. Можете ли вы использовать защищенный внутренний ?
Ответ №1:
Решение состоит в том, чтобы создать private
участников, которых вы хотите протестировать internal
. затем вы можете добавить InternalsVisibleTo
атрибут.
[assembly: InternalsVisibleTo("sometestrepo")]
если вы используете Moq,вы можете использовать что-то подобное:-
var mockAddress = new Mock<Details>();
mockAddress.SetupGet(p => p.Id).Returns(42);
mockAddress.SetupGet(p => p.Name).Returns("Whatever you want to match");
var mockAddressRepository = new Mock<IRepository<Details>>();
var addresses = new List<Details> { mockAddress.Object };
mockAddressRepository.Setup(p => p.GetEnumerator()).Returns(addresses.GetEnumerator());
var addressToMatch = mockAddressRepository.Object.FirstOrDefault(address => address.Id == 42);
Console.WriteLine(addressToMatch.Name);
Ожидаемый Результат Составляет:-
Whatever you want to match
Комментарии:
1. Я думаю, вы неправильно поняли, о чем я спрашиваю. Я буквально не могу сделать mockAddress. Настройка(p => p.Id).Возвращает(42); поскольку свойство или индексатор «свойство/индексатор» нельзя использовать в этом контексте, поскольку средство доступа set недоступно
Ответ №2:
Одно из решений, которое может сработать, — это использовать подделку.
В своем тестовом классе создайте поддельный Details
класс, унаследованный от Details
. Тогда вы могли бы обновить собственность.
public class FakeDetails : Details
{
public new int Id { get; set; }
}
Затем вы можете использовать подделку в своем тесте, чтобы задать свойства.
var fakeDetails = new FakeDetails();
fakeDetails.Id = 15;
fakeDetails.Name = "Some Name";