2009-09-02 7 views
2

Est-il possible dans Rhino.Mocks de vérifier si un constructeur spécifié a été appelé?Rhino Mocks: Comment vérifier qu'un constructeur a été appelé

Consultez le code suivant:

public interface IFoo 
{ 
    void Bar(); 
} 

public class FooFactory 
{ 

    public IFoo CreateInstance(int x, int y) 
    { 
    return new Foo(x, y); 
    } 

} 

public class Foo : IFoo 
{ 

    public Foo(int x, int y) 
    { 
    // ... blah 
    } 

    public void Bar() 
    { 
    // blah... 
    } 

} 

[TestFixture] 
public class FooFactoryTest 
{ 

    [Test] 
    public void Assert_Foo_Ctor_Called_By_Factory_CreateInstance() 
    { 

    MockRepository mocks = new MockRepository(); 

    using (mocks.Record()) 
    { 
     Expect.Call(/* ???? */); 
    } 

    using(mocks.Playback()) 
    { 
     new FooFactory().CreateInstance(1, 2); 
    } 

    mocks.VerifyAll(); 

    } 

} 

Je voudrais vérifier que Foo (int, int) a été appelé par le FooFactory.

Répondre

4

Réponse courte: Non, ce n'est pas comme cela que fonctionnent les Rhino Mocks (ou tout cadre de simulation).

Réponse plus longue: Vous ne le faites pas correctement. L'une des raisons d'utiliser une fabrique est que vous pouvez vous moquer lorsque de nouveaux objets sont créés - cela signifie que vous vous moqueriez de votre FooFactory et que vous fourniriez le faux pour les tests d'autres objets. Peut-être avez-vous beaucoup de logique dans votre usine que vous aimeriez tester également - pensez à séparer cette logique dans une autre classe comme un constructeur qui peut être testé isolément.

+0

D'accord. Je remettrais fortement en question le besoin de tester qu'un constructeur spécifique a été appelé ... semble sur spécification à moi. Ce que vous devriez tester, c'est que l'usine produit la sortie attendue en fonction d'une entrée spécifique. –

2

Je ne pense pas que vous puissiez faire ce que vous demandez. Toutefois, si

Foo(int, int)
est le seul constructeur Foo, vous pouvez simplement affirmer le type de l'objet IFoo retourné à savoir

 
Assert.IsInstanceOfType(typeof(Foo), foo); 

S'il y a plus d'un constructeur alors vous devez vérifier un état externe du retour objet:

 
Foo f = (Foo)fooReturnedFromFactory; 
Assert.AreEqual(1, f.X); 
Assert.AreEqual(2, f.Y); 
0

Ne pensez pas que vous pouvez tester si le constructeur a fonctionné directement.

Mais vous pourriez le tester indirectement. Par exemple, si vous définissez la propriété "A" sur 5, vous pouvez tester la valeur de la propriété "A".

Questions connexes