2015-02-17 4 views
1

Я возился с Moq, и я не могу понять, почему следующее доказательство правильности концепции сниппет бросает NullReferenceException при доступе к mock.Object.SingleOrDefault:Moq и найти выражения - Null Reference Исключение

var myObject = new MyObject() { Id = 1, Name = "Name" }; 
var mock = new Mock<MyInterface<MyObject>>(); 
mock 
    .Setup(t => t.Find(It.IsAny<Expression<Func<MyObject, bool>>>())) 
    .Returns(myObject); 

var mySecondObject = mock.Object.SingleOrDefault(a => true); 
Assert.AreEqual(myObject, mySecondObject); 

Любые подсказки ?

+1

Вы не установили 'SingleOrDefault', почему вы ожидаете вернуть что-то другое в null? Вы хотели использовать 'Find'? –

+0

Я пробовал это, но получил другое исключение: NotSupportedExceptoin: "Дополнительная информация: выражение ссылается на метод, который не принадлежит к издеваемому объекту:" – mo5470

+0

@ClaudioRedi Mock может настраивать только виртуальные экземпляры экземпляра типа (в этом случае на 'MyInterface <>'). Но 'SingleOrDefault' - это метод расширения Linq. Скорее всего, это статический метод 'Enumerable.SingleOrDefault' или' Queryable.SingleOrDefault'. –

ответ

2

Я предполагаю, что ваш MyInterface наследует IQueryable. Затем, когда вы вызываете SingleOrDefault на это, он вызывает свойство IQueryable.Provider в предоставленном экземпляре.

Поскольку вы не издевались над свойством IQueryable.Provider, он возвращает null из mock, поэтому у вас есть исключение NullReferenceException.

Попробуйте установить MockBehavior.Strict, чтобы узнать, является ли это причиной.

Смежные вопросы