Я не уверен, что это хорошая идея для проверки выражений.Но вы можете попробовать, если хотите.У меня есть хотя бы одна идея для такого запроса.
Вместо репозитория потребуется предоставить макет, вы можете использовать любую библиотеку, какую пожелаете. Moq или NSubstitute в качестве примера.
Затем вы должны получить Expression<Func<Domain.Person, bool>>
объект, переданный в ваш репозиторий при вызове SingleOrDefaultAsync
.Это должно быть довольно просто с большинством насмешливых библиотек.
И, наконец, вам нужно скомпилировать ваше выражение в Func<Domain.Person, bool>
и утверждать, что оно возвращает true
для Domain.Person
объекта с ожидаемым Id
и false
в противном случае.
И небольшой снимок, чтобы проиллюстрировать, я предполагаю, что здесь есть только один аргумент, это единственный вызов для объекта репозитория и что Domain.Person.Id
имеет открытый сеттер.
var repository = Substitute.For<IRepository>();
var service = new Service(repository);
var person = new Domain.Person { Id = 42 };
await service.ArchiveAsync(person);
var call = repository.ReceivedCalls().First();
var arg = call.GetArguments().First();
var expr = (Expression<Func<Domain.Person, bool>>)arg;
var func = expr.Compile();
Assert.True(func(person));
Assert.False(func(new Domain.Person {Id = 1}));