У меня есть совокупность объектов (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
XUnit с NSubstitute - замененный общедоступный IReadOnlyCollection пуст, кроме частного списка, имеет значение ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как работают параметры `IReadOnlyCollection
`, если у `IReadOnlyCollection ` нет метода Add?
Anonymous » » в форуме C# - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как работают параметры `IReadOnlyCollection
`, если у `IReadOnlyCollection ` нет метода Add?
Anonymous » » в форуме C# - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как работают параметры `IReadOnlyCollection
`, если у `IReadOnlyCollection ` нет метода Add?
Anonymous » » в форуме C# - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-