A.CallTo метод, который использует выражение в качестве параметра - PullRequest
1 голос
/ 11 апреля 2011

Я пытаюсь сделать что-то вроде этого, и это не работает, хотя это должно быть

A.CallTo(() => partyRepo.Where(o => o.Person != null))
                        .Returns(new[] {new Party()});

вызов этого метода с этим точным кодом в качестве параметра возвращает пустой Enumerable

1 Ответ

3 голосов
/ 11 апреля 2011

Причина в том, что выражение, которое вы передаете в спецификации вызова, и выражение, которое фактически отправлено в partyRepo, не будут равны.FakeItEasy не может определить, являются ли аргументы единственными, но использовать метод Equals.

Я не совсем уверен, что будет лучшим обходным путем, вы могли бы сделать что-то вроде этого:

public static class MyArgumentConstraints
{
    public static Func<MyClass, bool> ReturnsTrueWhenPersonIsNotNull(this IArgumentConstraintManager<Func<MyClass, bool>> manager)
    {
        return manager.NullCheckedMatches(x =>
                                                {
                                                    return x.Invoke(new MyClass() {Person = "person"}) &&
                                                            !x.Invoke(new MyClass() {Person = null});
                                                },
                                            x => x.Write("predicate that returns true for non null person"));
    }
}

public class MyClass
{
    public string Person { get; set; }
}

С этим расширением вы можете переписать вашу оригинальную строку:

A.CallTo(() => partyRepo.Where(A<Func<MyClass, bool>>.That.ReturnsTrueWhenPersonIsNotNull())
                    .Returns(new[] {new Party()});
...