как заполнить ObjectResult из списка <> - PullRequest
3 голосов
/ 19 января 2012

Чтобы протестировать метод, который использует хранимую процедуру, был создан поддельный метод.Этот метод возвращает список целых чисел.

Что-то вроде этого ...

    public virtual ObjectResult<Nullable<int>> available_IDs( ... )
    {
        List<int?> fakeAvailableIDList = new List<int?>();
        fakeAvailableIDList.Add(1);
        fakeAvailableIDList.Add(2);
        fakeAvailableIDList.Add(3);

        ObjectResult<Nullable<int>> result = fakeAvailableIDList.All(m => m > 0);
        return result;
    }

, которое завершается неудачно с

Cannot implicitly convert type 'bool' to 'System.Data.Objects.ObjectResult<int?>'

попытки (среди других вещей)

ObjectResult<Nullable<int>> result = fakeAvailableIDList.All(m => m > 0);

, что дает

Cannot implicitly convert type 'System.Collections.Generic.List<int?>' to 'System.Data.Objects.ObjectResult<int?>'

как я могу получить List <> в ObjectResult?

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Строка

fakeAvailableIDList.All(m => m > 0);

возвращает логическое значение, поскольку .All возвращает True или False в зависимости от того, соответствуют ли все элементы в коллекции указанному условию.

Таким образом, переменная типа ObjectResult не может быть установлена ​​в переменную типа Bool.

Типы ObjectResult и ObjectResult<T> имеют скрытые конструкторы, что означает, что вы не можете создавать экземплярыпо желанию.Кроме того, тип ObjectResult<T> является закрытым, что означает, что он не может быть расширен.Таким образом, вам может не повезти, если вы ищете простой способ создания ObjectResult из Enumerable.

Думаю, проще всего будет изменить типиспользуется методом, который вы пытаетесь проверить.Итак, если этот метод имеет сигнатуру:

void Foo(ObjectResult<int?> result);

Измените ее на:

void Foo(IEnumerable<int?> result);

Это позволит вам создать поддельную коллекцию, с которой можно протестировать метод, и выВы все еще сможете передать метод типа ObjectContext<int?>, потому что ObjectContext<int?> extends IEnumerable<int?>.

1 голос
/ 12 сентября 2012

Я понимаю, что на это уже был дан ответ, но решение, которое я нашел, состоит в том, чтобы смоделировать конкретное расширение Linq с ObjectResult<T>.

Например:

Mock.Get(PortalEntitiesMock).Setup(m => m.ExecuteSqlQuery(It.Is<String>(x => x.ToUpper().StartsWith("SELECT"))).FirstOrDefault()).Returns<string>(p=>p).Verifiable();

Таким образом, вы можете смоделировать отдельные предметы на объекте O bjectResult<T>, если не фактический ObjectResult<T>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...