Rhino Mocks: создание экземпляра свойства Mock, чтобы ожидание могло ссылаться на него - PullRequest
1 голос
/ 07 июня 2011

Я пишу юнит-тест с макетом, и у меня проблемы с написанием его успешно.Одним из свойств является коллекция, и мне нужно ссылаться на нее при установке ожидания для макета.Прямо сейчас ожидание выдает ноль.Вот как это выглядит примерно:

IFoo myMock = MockRepository.GenerateMock<IFoo>();
List<Entity> col = new List<Entity>();
Entity entity = new Entity();

myMock.Expect(p => p.FooCollection).Return(col);
myMock.Expect(p => p.FooCollection.Add(entity)); // throws null exception here

Я новичок в издевательствах над носорогом и у меня такое чувство, что я делаю это неправильно.Есть ли еще способ правильно создать экземпляр коллекции?Возможно, без ожидания, как у меня выше?

Обновление
Я думаю, что у меня проблема, потому что определенный мной интерфейс определяет коллекцию только для чтения.

interface IFoo
{
    List<Entity> FooCollection { get; }
}

Ответы [ 2 ]

1 голос
/ 08 июня 2011

Я не слишком знаком с Rhino Mocks, но я думаю, что ваши ожидания не связаны на самом деле , пока вы не наберете .Replay() - методология насмешек, на которую вы намекаете в своем примере, больше похожа на Moq для меня.

Тем не менее, я думаю, что вы делаете что-то более фундаментальное неправильно здесь.Что именно вы хотите проверить?Это p объект или что-то на List<Entity>?Если вы действительно хотите проверить, что p.YourMethodUnderTest() фактически добавляет entity к коллекции, вы, вероятно, просто хотите настроить p.FooCollection, чтобы он возвращал ваш список, а затем убедитесь, что ваш список содержит объект-сущность.

// Arrange
IFoo myMock = MockRepository.GenerateMock<IFoo>();
List<Entity> col = new List<Entity>();
Entity entity = new Entity();

myMock.Expect(p => p.FooCollection).Return(col);
// myMock.Expect(p => p.FooCollection.Add(entity)) - skip this

// Act
p.YourMethodUnderTest(entity);

// Assert
Assert.IsTrue(col.Contains(entity)); // Or something like that
0 голосов
/ 08 июня 2011

Вместо макетов вы должны использовать заглушки, например:

IFoo myMock = MockRepository.GenerateStub<IFoo>();
myMock.FooCollection = col;

Также вы устанавливаете ожидание для реального объекта (collection.Add ()), который на самом деле не будет работать.Вы можете решить эту проблему, указав FooCollection тип свойства IList вместо конкретного List.

Использование конкретных типов коллекций в качестве параметров в любом случае является запахом кода (и я предлагаю использовать FxCop, чтобы научить вас таким вещам).

...