NSubstitute — принять любой аргумент, созданный с определенным параметром.C#

Место общения программистов C#
Ответить
Anonymous
 NSubstitute — принять любой аргумент, созданный с определенным параметром.

Сообщение Anonymous »

Я пытаюсь имитировать репозиторий, который наследуется от класса BaseRepository в библиотеке Ardalis.Specification.EntityFrameworkCore. Этот базовый класс предоставляет метод ListAsync, который принимает подкласс класса Specification.
Это одна из тех спецификаций, которые я создал:

Код: Выделить всё

public sealed class SomeSpecification: Specification
{
public SomeSpecification(Guid someSubEntityID)
{
Query
.Include(p => p.SomeSubEntity)
.Where(p => p.SomeSubEntity.Id == someSubEntityID)

.Include(p => p.SomeOtherSubEntity)

.OrderBy(p => p.SomeProperty);
}
}
При написании модульных тестов я пытаюсь настроить макет для моего ISomeEntityRepository для этого конкретного метода, используя этот класс спецификации. Я хочу иметь возможность возвращать определенную коллекцию, когда этому методу передается любой объект SomeSpecification, который был создан с использованием КОНКРЕТНОГО руководства. Как видите, идентификатор, передаваемый этому конструктору, не сохраняется нигде в классе как свойство или поле при его создании.
Я могу сделать что-то вроде этого, когда метод просто возвращает определенную коллекцию, которую я сохраняю в классе EntityConstants, когда передается какая-либо SomeSpecification:

Код: Выделить всё

_pfRepoMock.ListAsync(
Arg.Any(), Arg.Any())
.Returns(Task.FromResult(EntityConstants.SomeEntityCollection()));
Это работает нормально, но я не могу вернуть две разные коллекции в зависимости от того, какое руководство было передано конструктору SomeSpecification. В моем идеальном мире мне хотелось бы иметь возможность делать что-то вроде этого:

Код: Выделить всё

_pfRepoMock.ListAsync(
Arg.Any().ConstructedWith(EntityConstants.SomeID), Arg.Any())
.Returns(Task.FromResult(EntityConstants.SomeEntityCollection()));

_pfRepoMock.ListAsync(
Arg.Any().ConstructedWith(EntityConstants.SomeOtherID), Arg.Any())
.Returns(Task.FromResult(EntityConstants.SomeDifferentEntityCollection()));
Я знаю, что существует библиотека NSubstitute.Equivalency, которая добавляет класс ArgEx, но я не понимаю, как она может выполнить то, что я хочу.
Как я могу этого добиться?>

Подробнее здесь: https://stackoverflow.com/questions/798 ... -parameter
Ответить

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

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

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

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

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