Настройка поведения метода выглядит как вызов метода

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

Я пытаюсь настроить поддельный 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 не будет их издеваться.


person xofz    schedule 19.08.2010    source источник


Ответы (2)


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

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

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

Надеюсь это поможет! Ник

person Community    schedule 19.08.2010
comment
О да! Я должен был более тщательно изучить мою первоначальную проблему. Проблема решена. Большое спасибо Николай! На самом деле я передаю ContainerBuilder в одном месте своего приложения, только загрузчику и хочу убедиться, что он правильно регистрирует мои модули. - person xofz; 19.08.2010

К сожалению, в настоящее время в Isolator есть ошибка, которая не позволяет подделывать контейнеры 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);
    }
}
person Igal Tabachnik    schedule 19.08.2010
comment
Спасибо за ответ, hmemcpy! Я бы сделал это, но на самом деле я также подделываю сборщик, потому что это переданная зависимость от загрузчика. - person xofz; 19.08.2010