Как я могу использовать Rhino Mocks для макета экспорта MEF? - PullRequest
4 голосов
/ 04 мая 2009

Со ссылкой на Managed Extensibility Framework (MEF) я пытаюсь понять, как создавать чистые тесты с макетами.

У меня есть экспортированный компонент, который имеет три личных импорта. Каждый импортируемый объект (поле) должен быть смоделирован. Учитывая, что CompositionContainer использует причудливую тактику отражения для установки импортированных закрытых полей компонуемых деталей, даже в модульных тестах мне потребуется использовать контейнер для установки значений этих полей.

Как мне указать контейнеру во время выполнения принять динамический объект, который я создал с помощью Rhino Mocks, в качестве допустимого экспорта, чтобы его можно было использовать для удовлетворения импорта в тестируемом компоненте?

1 Ответ

5 голосов
/ 04 мая 2009

На мой вопрос ответили здесь .


Привет, Натан

Здесь есть несколько вариантов.

  1. Используя пакет, вы можете вызвать метод AddExportedObject, чтобы добавить фиктивный экземпляр в контейнер. AddExportedObject позволяет вам указать контракт для добавляемого вами экземпляра. то есть batch.AddExportedObject (mockLogger, typeof (ILogger));

  2. Вы также можете создать собственный поставщик экспорта, который позволит вам добавлять фиктивные экземпляры. Если вы перейдете по этой ссылке, вот несколько утилит, которые я использую. http://pastie.org/467842. Внутри вы найдете FakeExportProvider, а также FakeExportDefinitions. FakeExportDefinitions принимает функцию для экземпляра. Это означает, что вы можете передать ему экземпляр или даже напрямую создать макет.

Вот пример кода, иллюстрирующий использование.

    protected override void Context()
    {
        MockCache = MockRepository.GenerateStub<ICache>();
        var metadata = new Dictionary<string, object> ()
        var cacheDefinition = new FakeInstanceExportDefinition(typeof(ICache), MockCache, metadata);
        FakeProvider = new FakeExportProvider(f => ((FakeInstanceExportDefinition)f).Instance);
        FakeProvider.AddExportDefinitions(cacheDefinition);
        CacheExport = FakeProvider.GetExport<ICache>();
    }

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

var container = new CompositionContainer (null, FakeProvider).

НТН Гленн

...