2009-03-04 4 views
2

J'ai une méthode qui ne devrait être appelée que lorsqu'une propriété d'un objet spécifique a la valeur false. C'est sa valeur initiale. Après le premier appel, la propriété est définie sur true, ce qui garantit que l'appel n'est effectué qu'une seule fois.Est-il possible de définir une valeur de propriété d'objet pendant Expect.Call dans RhinoMocks?

Cependant, lorsque je me moque de la classe qui effectue cette modification, l'objet fantaisie ne modifie pas la propriété de l'objet sous-jacent.

Existe-t-il un moyen de forcer le changement d'une propriété sur un objet lorsqu'une réponse est satisfaite?

Quelque chose le long des lignes de ...

Expect.Call(mockedObject.TestMethod(underlyingObject)).NowDoThis(delegate() { underlyingObject.Processed = true; }); 

Répondre

3

Oui,

au lieu de votre NowDoThis() appeler essayer Do()


enfin à la maison, je peux essayer du code.

L'astuce est de lancer le délégué anonyme pour le type d'action que derrives de System.Delegate (type MethodInvoker devrait également fonctionner, mais ce type est seulement disponible en System.Windows.Forms)

est ici le code. Je suis plus à l'aise avec la syntaxe rhinocéros AAA. Faites-moi savoir si je dois le convertir à la syntaxe Expect.Call. J'utilise aussi xunit.net, [Fait] signifie simplement [Test]

public interface Thingie 
{ 
    bool Flag { get; set; } 
    void DoSomething(); 
} 

[Fact] 
public void Test() 
{ 
    var thingie = MockRepository.GenerateStub<Thingie>(); 

    thingie.Stub(x => x.DoSomething()).Do((Action) delegate { thingie.Flag = true; }); 

    Assert.False(thingie.Flag); 

    thingie.DoSomething(); 

    Assert.True(thingie.Flag); 
} 
+0

Hmm. Lorsque je le fais, j'obtiens une erreur "Impossible de convertir une méthode anonyme en type 'System.Delegate' car ce n'est pas un type de délégué". – BlackWasp

0

est mockedObject En supposant, en fait, un objet fantaisie, vous pouvez simplement définir une valeur de retour pour votre propriété après la méthode d'essai a appelé:

bool isProcessed = false; 
Expect.Call(mockedObject.TestMethod(underlyingObject)) 
    .Do(new Action(() => isProcessed = true)); 

SetupResult.For(mockedObject.Processed).Return(isProcessed); 
Questions connexes