2013-06-07 2 views
3

У меня возникает проблема, когда я пытаюсь высмеять объект, который содержит свойство Items типа ICollection<>. Я получаю следующее сообщение об ошибке:Moq a virtual ICollection <> свойство, которое имеет частный набор: «Неверная настройка на не виртуальном»

System.NotSupportedException: Invalid установки на невиртуальном (переопределение в VB) член: т => m.Items

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

Я воспроизвел ошибку, что я получаю в моем проекте, в песочнице ниже:

public class ItemList 
{ 
    public virtual int Id { get; set; } 
} 

public class SpecialList 
{ 
    public virtual string Token { get; internal set; } 
    public virtual ICollection<ItemList> Items { get; private set; } 
} 

Эта ошибка возникает в моем тесте, когда я пытаюсь SetupProperty так:

[TestFixture] 
public class TestSpecialList 
{ 
    [Test] 
    public void Mocking_Virtual_ICollection() 
    { 
     var mockModel = new Mock<SpecialList>(); 
     var listItem = new List<ItemList> {new ItemList {Id = 007}}; 

     mockModel.SetupProperty(m => m.Items, listItem); 
    } 
} 

Am I что-то не так? Возможно ли для Moq объект, содержащий свойство ICollection <>?

+0

Можете ли вы сделать mockModel.object.items = listItem? – TJF

+0

@ user1168234 Не в моем случае, потому что набор должен быть закрытым. – ForceMagic

ответ

5

Попробуйте использовать любой из них:

mockModel.Setup(m => m.Items).Returns(listItem); 
mockModel.SetupGet(m => m.Items).Returns(listItem); 

Метод SetupProperty используется, когда вы хотите, чтобы отслеживать его значение, см moq wiki. Хотя я не безразлично, почему SetupProperty терпит неудачу, поскольку его намерение состоит в том, чтобы иметь возможность осваивать и извлекать стоимость имущества, это, вероятно, вызвано частным получением.

Чтобы было ясно, предположим, что ваша собственность имеет открытый набор. В этом случае при использовании Setup или SetupGet выполнение чего-то вроде mockModel.Object.Items = new List<ItemList>(); не повлияет, и вы все равно увидите список с одним элементом. Однако с SetupProperty тот же оператор изменил бы значение, возвращаемое свойством.

В основном SetupProperty позволяет получить И УСТАНОВИТЬ значение свойства, и именно поэтому я думаю, что он не может использоваться с частным набором.

+0

Правильно, я сделал несколько тестов, и кажется, что это «частный набор», когда вы указываете мне, тогда как если бы я сделал его внутренним, он работает !!! Хотя я не могу сделать их внутренними, поэтому я проверю ваше решение. – ForceMagic

+0

@ForceMagic Отлично! просто добавила еще больше информации :) –

+0

Это действительно работает! : D Большое спасибо за разъяснение понятий и за быстрый ответ. Я использовал Setup(). Возвращает раньше, хотя я понятия не имею, почему я думал, что не могу использовать его снова в этом случае. – ForceMagic

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