Как настроить / Moq тестирование внутреннего задатчика в модели в ASP.NET Сердечник

#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";