2016-09-23 45 views
3

我试图生成Expression<Predicate<T>>与AutoFixture这种方式创建谓词表达式:与AutoFixture

var fixture = new Fixture(); 
var predicateExpr = _fixture.Create<Expression<Predicate<string>>>(); // exception 

当我运行这段代码,我得到以下异常:

System.InvalidCastException 
Unable to cast object of type 
'System.Linq.Expressions.Expression`1[System.Func`1[System.String]]' 
to type 
'System.Linq.Expressions.Expression`1[System.Predicate`1[System.String]]'. 
    at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenContext context, T seed) 
    at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenContext context) 

现在,当我运行类似的东西,但Predicate<T>取代Func<T>代码效果很好。

var func = _fixture.Create<Expression<Func<string, bool>>>(); // no exception 

而且,一切都很好,如果我尝试创建Predicate<T>(而不是Expression<Predicate<T>>

var predicate = _fixture.Create<Predicate<string>>(); // no exception 

我在做什么错在这里?有没有一种方法可以用AutoFixture创建谓词表达式?

+0

如何在没有AutoFixture的情况下创建它? –

回答

1

它看起来像一个错误或不支持的用例。你可以通过夹具定制来解决这个问题:

public class PredicateCustomization : ICustomization 
{ 
    public void Customize(IFixture fixture) 
    { 
     fixture.Register(() => (Expression<Predicate<string>>) (s => true)); 
    } 
} 

===== 

var fixture = new Fixture(); 
fixture.Customize(new PredicateCustomization()); 

var predicateExpr = fixture.Create<Expression<Predicate<string>>>();