2010-12-01 41 views
0

J'ai une classe A qui appelle une méthode sur l'interface B, en lui passant une de ses propres méthodes comme une sorte de continuation que B est supposé appeler quand il a un résultat. Le code semble bien fonctionner en pratique, mais je n'arrive pas à comprendre comment le tester avec Moq - quand j'essaie la chose évidente, il produit System.ArgumentException : method argument length mismatch. Je pensais que tout d'abord il pourrait être mon code, mais il échoue de la même façon avec le cas des jouets suivants:Moq: Vérification d'une méthode a été appelée avec un délégué particulier produit "méthode discordance de longueur d'argument"

public class A 
{ 
    readonly B myB; 

    public A (B b) 
    { 
     myB = b; 
    } 

    public void HandleC (C c) 
    { 
     // do something 
    } 

    public void DoFindC() 
    { 
     myB.FindC (HandleC); 
    } 
} 

public interface B 
{ 
    // Finds a C and then passes it to handleC 
    void FindC (Action<C> handleC); 
} 

public interface C 
{ 
} 

[TestFixture()] 
public class ATest 
{ 
    [Test()] 
    public void TestDoFindC() 
    { 
     Mock<B> bMock = new Mock<B>(); 
     A a = new A(bMock.Object); 
     a.DoFindC(); 

     bMock.Verify(b => b.FindC(a.HandleC)); 
    } 
} 

Je devine qu'il ya un peu de magie derrière les coulisses avec les délégués que je ne comprends pas encore, être relativement nouveau à C#, mais quelle est la bonne façon de tester cela?


Mise à jour: Pour référence, j'utilise Mono 2.6.7 sur Mac OS 10.6.5 et le ciblage .NET 3.5.


Mis à jour à nouveau: meilleure estimation est que c'est un bug Mono; Je l'ai classé comme https://bugzilla.novell.com/show_bug.cgi?id=656918.

+0

Je viens de copier votre code et le test réussi. J'utilise xUnit, mais je ne pense pas que cela aurait de l'importance. Utilisez-vous la dernière version de Moq? –

+0

J'utilise Moq 4.0.10827 - semble toujours être la dernière version. Peut-être que c'est un bug Mono? J'utilise Mono 2.6.7 et le ciblage .NET 3.5, si cela peut faire une différence. Je ne vois aucune classe NUnit dans la trace de la pile, donc ce n'est probablement pas NUnit vs xUnit. –

+1

Je viens de ré-exécuter le test ciblant .NET 3.5 et il est passé. À ce stade, je dirais que cela ressemble à un problème avec Mono. –

Répondre