Настройка поведения на методе, по -видимому, вызывает метод
Вопрос
Я разместил это на форумах Typemock, но слишком нетерпелив, чтобы ждать ответа там. Это очень N00B.
Я пытаюсь настроить фальшивый иконтенер. Вот что у меня есть:
var container = Isolate.Fake.Instance<IContainer>();
var program = Isolate.Fake.Instance<IProgram>();
Isolate.WhenCalled(() => container.Resolve<IProgram>()).WillReturn(program);
(IProgram
это интерфейс в моем коде).
Когда я пытаюсь запустить этот код, я получаю исключение Autofac: «Запрашиваемая служба MyApp.iprogram не была зарегистрирована».
Как можно бросить это исключение? Я на самом деле не называю intaner.resolve (), верно? Я просто настраиваю его, чтобы вернуть фальшивую ипрограмму.
Несвязанная справочная информация: я испытываю TypeMock, потому что AutoFac широко использует методы расширения, и MOQ не издевается над ними.
Решение
Пара вещей, которые могут помочь - во -первых, вы можете издеваться Resolve()
вызовы с MOQ путем настройки IComponentContext.Resolve()
, которые делегируют все методы расширения.
Во -вторых, Autofac разработан таким образом, чтобы вам не приходилось использовать его интерфейсы из своих компонентов. Смотрите примеры:
- http://nblumhardt.com/2010/01/the-relationship-zoo/
- http://code.google.com/p/autofac/wiki/typednamedandkeedservices и
- http://code.google.com/p/autofac/wiki/delegatefactories
Где вам нужно использовать (и, таким образом, насмехаться) IContainer
или аналогичный интерфейс, вы, вероятно, можете сделать то же самое, используя Func
, IIndex
и/или Owned
Типы отношений.
Надеюсь это поможет! Ник
Другие советы
К сожалению, в настоящее время есть ошибка в изоляторе, которая предотвращает фальшивые контейнеры 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);
}
}