La mise en place sur le comportement d'une méthode semble appeler la méthode
Question
a publié ce billet sur les forums Typemock, mais je suis trop impatient d'attendre une réponse là-bas. Ceci est une question très n00b.
Je suis en train de mettre en place un IContainer de faux. Voici ce que j'ai:
var container = Isolate.Fake.Instance<IContainer>();
var program = Isolate.Fake.Instance<IProgram>();
Isolate.WhenCalled(() => container.Resolve<IProgram>()).WillReturn(program);
(IProgram
est une interface dans mon code).
Lorsque je tente d'exécuter ce code, je reçois une exception Autofac: « Le MyApp.IProgram de service demandé n'a pas été enregistré. »
Comment cette exception pourrait être jeté si? Je ne demande pas en fait container.Resolve (), non? J'installe juste à retourner un faux iProgram.
Aucun lien information de fond. Je trialing Typemock parce que Autofac utilise des méthodes d'extension et largement Moq ne les railler
La solution
Un couple de choses qui peuvent aider - d'abord, vous pouvez se moquer des appels Resolve()
avec Moq par la mise en place IComponentContext.Resolve()
, qui
En second lieu, Autofac est conçu de telle sorte que vous ne devriez pas avoir à utiliser ses interfaces de vos composants. Voir des exemples:
- http://nblumhardt.com/2010/01/the-relationship- zoo /
- http://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices et
- http://code.google.com/p/autofac/wiki/DelegateFactories
Si vous devez utiliser (et donc simulé) IContainer
ou une interface similaire, vous pouvez probablement faire la même chose en utilisant le Func
, IIndex
et / ou types de relations de Owned
.
Hope this helps! Nick
Autres conseils
Malheureusement, il y a actuellement un bogue dans Isolateur, ce qui évite truquer des conteneurs Autofac. Nous travaillons pour le résoudre le plus rapidement possible.
Dans le même temps, est-il une raison que vous ne l'utilisez Autofac comme prévu, ce qui signifie qu'il a retourner une instance de faux, tels que:
[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);
}
}