2010-05-01 6 views
2

Я пытаюсь издеваться в решимости Autofac, такие как«Решимость» метод расширения Mocking Autofac с TypeMock

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 registered».

ответ

2

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

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

+0

Как вы бы издевались? Пользуетесь ? –

+0

Обычно можно обрабатывать 'Owned ', как если бы это был базовый тип, например 'List ' или 'string' - создавать значения' Owned 'используя свой конструктор, когда вам это нужно, возможно, передавая макет для' T'. Надеюсь это поможет. –

+0

Для параметра lifeTime ctor Собственного класса , хорошо ли это просто передать в манере IDisposable? Что действительно должно быть передано в качестве этого параметра? Благодаря! –

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