XUnit с NSubstitute - замененный общедоступный IReadOnlyCollection пуст, кроме частного списка, имеет значениеC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 XUnit с NSubstitute - замененный общедоступный IReadOnlyCollection пуст, кроме частного списка, имеет значение

Сообщение Anonymous »

У меня есть совокупность объектов (WeeklyMenuItem), содержащая подобъект (WeeklyMenuItemIngredient) в виде коллекции. WeeklyMenuItemIngredient можно установить только с помощью методов (AddOrUpdateIngredient, RemoveIngredient). Публичная коллекция представляет собой IReadOnlyCollection с частным списком, доступным только для чтения.
Я хочу создать тест для «добавления ингредиентов» с помощью NSubstitute. Метод замены AddOrUpdateIngredient добавляет ингредиент в частный список, но позже я не могу получить доступ к значению через общедоступную коллекцию ReadOnlyCollection.
Если я создам WeeklyMenuItem как обычный класс, я смогу получить доступ ценность. Проблема возникает только с заменителем.
Разве NSubstitute не поддерживает IReadOnlyCollections?
WeeklyMenuItem с методом ReadOnlyCollection и AddOrUpdateIngredient:
public partial class WeeklyMenuItem(long dayId,
long? createdById = null,
long? createdId = null,
long? updatedById = null,
long? updatedId = null) : BaseEntity, IAggregateRoot

private readonly List _weeklyMenuItemIngredient = [];
public virtual IReadOnlyCollection WeeklyMenuItemIngredient => _weeklyMenuItemIngredient.AsReadOnly();

public void AddOrUpdateIngredient(long ingredientId, decimal amount)
{
if (!WeeklyMenuItemIngredient.Any(e => e.WeeklyMenuItemId == this.Id && e.IngredientId == ingredientId))
{
_weeklyMenuItemIngredient.Add(new WeeklyMenuItemIngredient(this.Id, ingredientId, amount));
return;
}

var dishIngredient = WeeklyMenuItemIngredient.First(e => e.WeeklyMenuItemId == this.Id && e.IngredientId == ingredientId);
dishIngredient.SetAmount(amount);
}

Тест XUnit с методами создания подмены:
private readonly decimal amount1 = 1;
private readonly decimal amount2 = 2;

[Fact]
public void AddIngredient()
{
var weeklyMenuItem1 = new WeeklyMenuItem(1, null, null, null, null); //working
var weeklyMenuItem1 = WeeklyMenuItemTestData.GetWeeklyMenuItem1(DayTestData.GetDay1(WeekTestData.GetWeek1())); //not working
var ingredient1 = IngredientTestData.GetIngredient1();

weeklyMenuItem1.AddOrUpdateIngredient(ingredient1.Id, amount1);

var addedIngredient1 = weeklyMenuItem1.WeeklyMenuItemIngredient.FirstOrDefault(); //Empty - result is null value

weeklyMenuItem1.WeeklyMenuItemIngredient.Should().HaveCount(1);
addedIngredient1.Should().NotBeNull();
addedIngredient1!.IngredientId.Should().Be(ingredient1.Id);
addedIngredient1!.Amount.Should().Be(amount1);
}

public static WeeklyMenuItem GetWeeklyMenuItem1(Day? day)
{
var weeklyMenuItem1 = Substitute.For(day?.Id, null, null, null, null);
weeklyMenuItem1.Id.Returns(Id1);
weeklyMenuItem1.Day.Returns(day);
return weeklyMenuItem1;
}

public static Day GetDay1(Week? week)
{
var day1 = Substitute.For(Date1, week?.Id, BusinessesIsOpen);
day1.Id.Returns(Id1);
day1.Week.Returns(week);
return day1;
}

public static Week GetWeek1()
{
var week1 = Substitute.For(Year1, Value1);
week1.Id.Returns(Id1);
return week1;
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... besides-pr
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как работают параметры `IReadOnlyCollection`, если у `IReadOnlyCollection` нет метода Add?
    Anonymous » » в форуме C#
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Как работают параметры `IReadOnlyCollection`, если у `IReadOnlyCollection` нет метода Add?
    Anonymous » » в форуме C#
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Как работают параметры `IReadOnlyCollection`, если у `IReadOnlyCollection` нет метода Add?
    Anonymous » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Как издеваться над DBSET с помощью XUNIT и NSUBSTITUTE?
    Anonymous » » в форуме C#
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Fail2ban не может заблокировать общедоступный IP-адрес, он работает только для частного IP-адреса.
    Anonymous » » в форуме Apache
    0 Ответы
    62 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»