Через некоторое время, настроив код для этого, я сделал несколько предположений.Я предполагаю, что вы заглушаете IWithQueryable через заглушку Moles, а также, что NullArgumentException возникает, когда вы удаляете утверждение Contract, что метод QueryableSet () не возвращает null.
Что касается кода,ИМО: чем больше кода, тем лучше, если это актуально - гораздо лучше иметь слишком много, чем слишком мало, чтобы продолжать, так что это нормально.Как и выше, постарайтесь прояснить все предположения в коде (например, заглушки Moles (так как есть разные способы для достижения этого, и это то, что нужно предположить).
Я не уверен на 100%, чтовы спрашиваете. Код терпит неудачу, потому что у заглушки IWithQueryable object
нет имплементации для метода QueryableSet()
, и этот метод возвращает null
. PexAssert
здесь не поможет понять, как создатьпровайдер LINQ, что вы и просите. PexChooseBehavedBehavior.Setup()
просто заменяет любые вызовы делегатов на заглушках Moles (у которых нет собственного делегата) поведением по умолчанию, равным default(T)
, поэтомувот почему source
равен нулю - QueryableSet()
инициализируется null
.
Вы можете решить эту проблему несколькими способами (по крайней мере, в смысле обеспечения способа создания QueryableSet()
method). Вы можете создать фабричный метод для генерации либо всего SIWithQueryable
, либо просто делегата QueryableSet
. Это то, что предлагает Пекс (однако, со мной он запутал типы и пространства имен).r экземпляр:
/// <summary>A factory for Microsoft.Moles.Framework.MolesDelegates+Func`1[System.Linq.IQueryable`1[StackOverflow.Q9968801.MyEntity]] instances</summary>
public static partial class MolesDelegatesFactory
{
/// <summary>A factory for Microsoft.Moles.Framework.MolesDelegates+Func`1[System.Linq.IQueryable`1[StackOverflow.Q9968801.MyEntity]] instances</summary>
[PexFactoryMethod(typeof(MolesDelegates.Func<IQueryable<MyEntity>>))]
public static MolesDelegates.Func<IQueryable<MyEntity>> CreateFunc()
{
throw new InvalidOperationException();
// TODO: Edit factory method of Func`1<IQueryable`1<MyEntity>>
// This method should be able to configure the object in all possible ways.
// Add as many parameters as needed,
// and assign their values to each field by using the API.
}
/// <summary>A factory for Microsoft.Moles.Framework.MolesDelegates+Func`1[System.Linq.IQueryable`1[StackOverflow.Q9968801.MyEntity]] instances</summary>
[PexFactoryMethod(typeof(SIWithQueryable))]
public static SIWithQueryable Create()
{
var siWithQueryable = new SIWithQueryable();
siWithQueryable.QueryableSet = () => { throw new InvalidOperationException(); };
return siWithQueryable;
// TODO: Edit factory method of Func`1<IQueryable`1<MyEntity>>
// This method should be able to configure the object in all possible ways.
// Add as many parameters as needed,
// and assign their values to each field by using the API.
}
}
, а затем подключите его к методу тестирования с помощью одной из двух строк, присваивающей sIWithQueryable
:
[TestMethod]
[PexGeneratedBy(typeof(ConsumerOfIhaveIQueryableTest))]
public void GetEntitiesByIdsThrowsArgumentNullException678()
{
SIWithQueryable sIWithQueryable;
// Either this for the whole object.
sIWithQueryable = MolesDelegatesFactory.Create();
// Or this for just that delegate.
sIWithQueryable = new SIWithQueryable();
sIWithQueryable.QueryableSet = MolesDelegatesFactory.CreateFunc();
ConsumerOfIhaveIQueryable consumerOfIhaveIQueryable;
IEnumerable<MyEntity> iEnumerable;
consumerOfIhaveIQueryable = ConsumerOfIhaveIQueryableFactory.Create((IWithQueryable) sIWithQueryable);
int[] ints = new int[0];
iEnumerable = this.GetEntitiesByIds(consumerOfIhaveIQueryable, ints);
}
. Затем при создании будут вызваны ваши фабричные методы.заглушка для IWithQueryable
.Это по-прежнему проблема, так как при восстановлении исследований будут уничтожены настройки заглушки.
Если вы предоставите заводской метод без параметров для создания заглушки (MolesDelegatesFactory.CreateFunc()
), тогда Пекс узнает об этом и сгенерирует тесты.использовать это.Таким образом, он будет корректно управлять поведением в тестовых регенерациях.К сожалению, Pex предлагает создать этот делегат как фабричный метод - однако, он никогда не вызывается, реализация по умолчанию всегда используется, кажется, что нужно высмеивать родительский тип.
Однако мне интересно, почему высоздаем интерфейс IWithQueryable
, который просто оборачивает другой, а также то, что вы ожидаете сделать с IQueryable
.Чтобы сделать что-то очень полезное, вам придется проделать большую работу, связанную с интерфейсом IQueryable
- в основном Provider
и Expression
, вам, скорее всего, придется написать провайдера ложных запросов., что будет нелегко.