Как смоделировать запрос NhibernateSession, который использует предложение Where и возвращает список - PullRequest
1 голос
/ 02 февраля 2012

Я не могу понять, как Rhino высмеивает следующее утверждение:

var jobs = nhibernateSession.Query<Job>()
.Where(x => x.Trust.Id == 1)
.ToList();

Я пробовал различные перестановки, но текущая неудачная попытка:

nhibernateSession.Expect(y => y.Query<Job>())
.IgnoreArguments()
.Return(new List<Job> { new Job() }.AsQueryable());

Я получаю сообщение об ошибке:

Source: Anonymously Hosted DynamicMethods Assembly
Message: Object reference not set to an instance of an object.
StackTrace:    at lambda_method(Closure , Job )
at System.Linq.Enumerable.WhereListIterator`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)

Спасибо за любой совет.

Stu

Ответы [ 3 ]

3 голосов
/ 02 февраля 2012

Это потому, что ваше свойство 'Trust' равно нулю для нового объекта Job (), который вы возвращаете из своего макета?

Это объясняет исключение NullReferenceException в предложении where:

.Where(x => x.Trust.Id == 1)

Если это проблема, то исправление:

nhibernateSession.Expect(y => y.Query<Job>())
    .IgnoreArguments()
    .Return(new List<Job> { new Job{ Trust = new Trust() } }.AsQueryable());
3 голосов
/ 05 февраля 2012

Query-метод - это метод расширения, если я правильно помню, и AFAIK не может быть подобным образом смоделирован с помощью moq.

2 голосов
/ 02 февраля 2012

Интересно - как у вас настроены слои? Похоже, что вы используете конкретную NHibernateSession, что в любом случае очень затруднит насмешку. Я бы посоветовал вам использовать ISession, который вы легко сможете издеваться.

Я не знаком с Rhino, но с помощью Moq я бы сделал:

Mock<ISession> MockSession = new Mock<ISession>();
MockSession.Setup(x => x.Query<It.IsAny<Job>()>())
           .Returns(new Lis<Job> { new Job()}.AsQueryable());

Как правило, интерфейсы легче имитировать, чем конкретные классы. Фактически, единственное место, где я использую конкретный класс, - это метод статической конфигурации, в котором я должен настроить свой контейнер IoC. В другом месте я использую интерфейсы. Таким образом, мои юнит-тесты вроде себя производят! :)

Надеюсь, это пригодится!

Счастливого кодирования,
Cheers,
Крис.

...