Я пытаюсь имитировать репозиторий, который наследуется от класса BaseRepository в библиотеке Ardalis.Specification.EntityFrameworkCore. Этот базовый класс предоставляет метод ListAsync, который принимает подкласс класса спецификации. Это одна из тех спецификаций, которые я создал:
Код: Выделить всё
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, созданный с использованием СПЕЦИФИЧЕСКОГО Guid. Как вы видите, идентификатор, передаваемый этому конструктору, не сохраняется нигде в классе как свойство или поле при его создании.
Я МОГУ сделать что-то вроде этого, когда метод просто возвращает определенную коллекцию, которую я сохраняю в классе EntityConstants, когда передается ЛЮБАЯ SomeSpecification:
Код: Выделить всё
_pfRepoMock.ListAsync(
Arg.Any(), Arg.Any())
.Returns(Task.FromResult(EntityConstants.SomeEntityCollection()));
Это работает нормально, но я не могу вернуть две разные коллекции в зависимости от того, какой Guid был передан конструктору 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