Как можно смоделировать или аналогичным образом ввести замену для метода расширения запроса, примененного к сеансу NHibernate? - PullRequest
3 голосов
/ 18 ноября 2010

Я пытаюсь смоделировать или подобный метод расширения запроса, примененный к сеансу nhibernate-3.Аналогично следующему ...

public IQueryable<Entity> GetEntities
{
  return entities = Session.Query<Entity>();
}

Где метод расширения Query возвращает коллекцию IQueryable.

Я могу четко смоделировать объект Session, используя Moq или Rhinos.Но на данный момент не найдено подходящего способа подделки или замены метода расширения.На самом деле чтение ответов на несколько вопросов о переполнении стека может оказаться невозможным.

см. Вопросы Как смоделировать методы расширения с помощью Rhino Mock? Методы расширения с помощью Moq и ссылки внутри ..

Я сталкивался с Microsoft Moles проект и подумал, может быть, я мог бы использовать это, чтобы создать подсобную сборку, с помощью которой я мог бы протестировать этот один конкретный метод.Используя Pex, довольно легко создать такую ​​сборку, однако, когда я пытаюсь найти способ использовать эту сборку, не всегда ясно, как это сделать.

В идеале я хотел бы просто проверить, чтобы сделатьубедитесь, что метод расширения запроса вызывается этим методом и возвращается упущенный результат ..

Кто-нибудь делал что-то подобное, хотел бы услышать мысли людей ..

Ps.есть тип издеваться, но у меня нет средств, чтобы купить его:)

1 Ответ

2 голосов
/ 18 ноября 2010

Методы расширения являются статическими методами. Таким образом, вы не можете использовать насмешливую библиотеку, такую ​​как Rhino Mocks или Moq. (Это ограничение CLR.) TypeMock или Moles обходят ограничение, вклиниваясь на уровне профилировщика. (Они регистрируются как профилировщик и внедряют код в домен вашего приложения.)

Вы можете просто определить свой собственный метод расширения с такой же сигнатурой, как в NHibernate.Linq.LinqExtensionMethods:

// NOT RECOMMENDED!!!
public static class MockedSessionExtensions {
    public static IQueryable<T> Query<T>(this ISession session) {
        // your mocked impl goes here
    }
}

Проблема в том, что он должен быть в вашем рабочем коде с некоторыми директивами условной компиляции.

Лично я проверяю интеграцию своих репозиториев с локальной базой данных или базой данных в памяти, такой как SQLite. Затем я проверяю свои репозитории при тестировании компонентов более высокого уровня. Я бы не советовал делать макеты ISession, ISessionFactory и т. П.

...