2010-08-19 2 views
1

Я разместил это на форумах TypeMock, но слишком нетерпеливо ждать ответа там. Это очень важный вопрос.Настройка поведения метода вызывает вызов метода

Я пытаюсь создать поддельный IContainer. Вот что у меня есть:

var container = Isolate.Fake.Instance<IContainer>(); 
var program = Isolate.Fake.Instance<IProgram>(); 

Isolate.WhenCalled(() => container.Resolve<IProgram>()).WillReturn(program); 

(IProgram представляет собой интерфейс в моем коде).

Когда я пытаюсь запустить этот код, я получаю исключение Autofac: «Запрошенная служба MyApp.IProgram не была зарегистрирована».

Как можно исключить это исключение? Я на самом деле не вызываю container.Resolve(), правильно? Я просто настраиваю его, чтобы вернуть поддельный IProgram.

Несвязанная информация о форексе: я тестирую TypeMock, потому что Autofac широко использует методы расширения, а Moq не будет имитировать их.

ответ

3

Несколько вещей, которые могут помочь - во-первых, вы можете высмеять Resolve() звонки с помощью Moq, установив IComponentContext.Resolve(), на который передаются все методы расширения.

Во-вторых, Autofac разработан так, что вам не нужно использовать свои интерфейсы от ваших компонентов. Смотрите примеры:

Где вы должны использовать (и, таким образом, насмешка) IContainer или подобный интерфейс, вы, вероятно, может сделать то же самое, используя Func, IIndex и/или Owned типы отношений.

Надеюсь, это поможет! Nick

+0

О Дух! Мне следовало бы более пристально рассмотреть мою первоначальную проблему. Проблема решена. Большое спасибо Николаю! Я фактически передаю ContainerBuilder в одном месте в своем приложении, только для загрузчика и хочу, чтобы он правильно регистрировал мои модули. –

2

К сожалению, в настоящее время в изоляторе имеется ошибка, которая предотвращает подделку контейнеров Autofac. Мы работаем над его устранением как можно скорее.

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

[TestFixture] 
public class TestClass 
{ 
    private ContainerBuilder builder; 
    private IContainer container; 

    [SetUp] 
    public void SetUp() 
    { 
     builder = new ContainerBuilder(); 
    } 

    [Test, Isolated] 
    public void Test1() 
    { 
     var fakeProgram = Isolate.Fake.Instance<IProgram>(); 

     builder.RegisterInstance(fakeProgram).As<IProgram>(); 
     container = builder.Build(); 

     var program = container.Resolve<IProgram>(); 

     Assert.AreEqual(fakeProgram, program); 
    } 
} 
+0

Спасибо за ваш ответ hmemcpy! Я бы сделал это, но я действительно фальсифицирую строителя, потому что это зависит от загрузочной способности. –

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