A.CallTo使用表达式作为参数的方法

时间:2011-04-11 13:34:05

标签: unit-testing fakeiteasy

我正在尝试做这样的事情,虽然它应该是

,但它不起作用
A.CallTo(() => partyRepo.Where(o => o.Person != null))
                        .Returns(new[] {new Party()});

使用此确切代码作为参数调用此方法将返回空的Enumerable

1 个答案:

答案 0 :(得分:3)

原因是你在调用规范中传递的表达式和实际发送到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()});