2016-09-23 2 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>>>(); 
Смежные вопросы