Метод расширения «Разрешить» в Autofac с помощью TypeMock - PullRequest
2 голосов
/ 01 мая 2010

Я пытаюсь смоделировать разрешение Autofac, например

using System;
using Autofac;
using TypeMock.ArrangeActAssert;

class Program
{
    static void Main(string[] args)
    {
        var inst = Isolate.Fake.Instance<IContainer>();
        Isolate.Fake.StaticMethods(typeof(ResolutionExtensions), Members.ReturnNulls);
        Isolate.WhenCalled(() => inst.Resolve<IRubber>()).WillReturn(new BubbleGum());
        Console.Out.WriteLine(inst.Resolve<IRubber>());
    }
}

public interface IRubber
{}

public class BubbleGum : IRubber
{}

Исходя из Moq, синтаксис и исключения из TypeMock меня сильно смущают. Изначально запустив это в TestMethod, я продолжал получать исключение, напоминающее «WhenCalled не может быть запущен без дополняющего поведения». Я пытался определить поведение для всех и их матерей, но безрезультатно.

Затем я выполнил отладку, прошел тестовый прогон и обнаружил, что из Autofac сработало фактическое исключение: IRubber не был зарегистрирован.

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

Isolate.WhenCalled(() => ResolutionExtensions.Resolve<IRubber>(null)).WillReturn(new BubbleGum());

... выдает исключение из Autofac с жалобой на то, что IComponentContext не может быть нулевым. Появление этого предположительно фальсифицированного IContainer (или вместо этого фальсификация IComponentContext) возвращает меня к ошибке «IRubber not зарегистрирован».

1 Ответ

2 голосов
/ 28 мая 2010

Это может быть один из тех случаев, когда плыть против течения - объем кода, необходимый для создания «реального» контейнера с зарегистрированной соответствующей зависимостью, меньше или похож на конфигурацию для TypeMock. Я бы предложил пойти по этому пути.

Вместо того, чтобы целевой компонент вообще зависел от IContainer, вы могли бы вместо этого использовать «Типы отношений», такие как Func, которые неявно поддерживаются Autofac и более выразительны, в дополнение к тому, что они легко поддразнимы. http://nblumhardt.com/2010/01/the-relationship-zoo/ имеет больше информации об этом подходе, как и http://code.google.com/p/autofac/wiki/DelegateFactories.

...