2010-08-19 27 views
1

J'ai posté cela sur les forums TypeMock, mais je suis trop impatient d'attendre une réponse. C'est une question très nbb. J'essaye de mettre en place un faux IContainer. Voici ce que j'ai:La configuration du comportement sur une méthode semble appeler la méthode

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 j'essaie d'exécuter ce code, je reçois une exception Autofac: "Le service demandé MyApp.IProgram n'a pas été enregistré."

Comment cette exception peut-elle être levée? Je n'appelle pas vraiment container.Resolve(), n'est-ce pas? Je suis juste en train de le configurer pour retourner un faux IProgram. Informations sur l'arrière-plan non lié: J'essaie TypeMock car Autofac utilise intensivement les méthodes d'extension et Moq ne les moque pas.

Répondre

3

Un couple de choses qui peuvent aider - tout d'abord, vous pouvez simuler des appels Resolve() avec Moq en configurant IComponentContext.Resolve(), auquel toutes les méthodes d'extension délèguent. Deuxièmement, Autofac est conçu de sorte que vous ne devriez pas avoir à utiliser ses interfaces à partir de vos composants. Voir des exemples:

Si vous devez utiliser (et donc simulé) IContainer ou une interface similaire, vous pouvez probablement faire la même chose en utilisant les types de relations Func, IIndex et/ou Owned.

Espérons que cela aide! Nick

+0

Oh bah! J'aurais dû regarder plus fort mon premier numéro. Le problème a été résolu. Merci beaucoup Nicholas! Je passe actuellement un ContainerBuilder à un endroit de mon application, juste pour le bootstrapper et je veux m'assurer qu'il enregistre correctement mes modules. –

2

Malheureusement, il existe actuellement un bogue dans Isolator, qui évite de truquer les 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); 
    } 
} 
+0

Merci pour votre réponse hmemcpy! Je ferais cela, mais je fais aussi semblant du constructeur parce que c'est une dépendance transmise au bootstrapper. –