2010-06-18 8 views
-1

Mon simulacre dynamique se comporte comme un simulacre de Parial, signifiant qu'il exécute le code réel lorsqu'il est appelé. Voici les façons je l'ai essayéQuestion de DynamicMock de Rhinomocks

var mockProposal = _mockRepository.DynamicMock<BidProposal>(); 
    SetupResult.For(mockProposal.CreateMarketingPlan(null, null, null)).IgnoreArguments().Repeat.Once().Return(
       copyPlan); 

      //Expect.Call(mockProposal.CreateMarketingPlan(null, null, null)).IgnoreArguments().Repeat.Once().Return(
      // copyPlan); 

      // mockProposal.Expect(x => x.CreateMarketingPlan(null, null, null)).IgnoreArguments().Return(copyPlan).Repeat.Once(); 

Au lieu de retourner ce que je pense qu'il exécute le code dans la méthode CreateMarketingPlan

Voici l'erreur:

System.NullReferenceException: Object reference not set to an instance of an object. 

at Policy.Entities.MarketingPlan.SetMarketingPlanName(MarketingPlanDescription description) in MarketingPlan.cs: line 76 
at Policy.Entities.MarketingPlan.set_MarketingPlanDescription(MarketingPlanDescription value) in MarketingPlan.cs: line 91 
at Policy.Entities.MarketingPlan.Create(PPOBenefits ppoBenefits, MarketingPlanDescription marketingPlanDescription, MarketingPlanType marketingPlanType) in MarketingPlan.cs: line 23 
at Policy.Entities.BidProposal.CreateMarketingPlan(PPOBenefits ppoBenefits, MarketingPlanDescription marketingPlanDescription, MarketingPlanType marketingPlanType) in BidProposal.cs: line 449 
at Tests.Policy.Services.MarketingPlanCopyServiceTests.can_copy_MarketingPlan_with_all_options() in MarketingPlanCopyServiceTests.cs: line 32 

Mise à jour: J'ai compris Ce que c'était. La méthode n'était pas "virtuelle", donc on ne pouvait pas la tourner en dérision car les méthodes non-virtuelles ne peuvent pas être mandatées.

+0

Pouvez-vous s'il vous plaît poster et accepter votre solution? Cela l'empêchera de rester une question ouverte. –

+0

Ceci doit être marqué comme répondu. – Kehlan

Répondre

0

Comme je l'ai compris ce que c'était je publie la réponse que j'ai posté à l'origine comme mise à jour à la question. La méthode n'était pas "virtuelle", donc on ne pouvait pas la tourner en dérision car les méthodes non-virtuelles ne peuvent pas être mandatées.

0

Pourquoi auriez-vous un simulacre exécutant votre code ?? C'est le but d'un simulacre. Vous simulez votre code réel afin que vous puissiez vous concentrer sur 1 et 1 seule zone de fonctionnalité dans un test.

Mise à jour:

Peut-être que j'ai mal compris. Si vous dites qu'il se comporte de cette façon involontairement, c'est peut-être dû à l'utilisation d'une classe concrète au lieu d'une interface.

par exemple. Remplacer

var mockProposal = _mockRepository.DynamicMock<BidProposal>(); 

avec

var mockProposal = _mockRepository.DynamicMock<IBidProposal>(); 
+0

Pourquoi? Parce que je me fiche de ce qui se passe dans cette méthode, je veux juste affirmer qu'elle est appelée une fois. Je ne teste pas cette méthode, je suis en train de tester une autre méthode, qui appelle CreateMarketingPlan sur BidProposal simulé. – epitka

+0

La façon dont je l'ai lu, je pensais que vous vouliez dire que vous aviez l'appel simulé dans votre code BidProposal, qui semblait très inutile. Comme je l'ai dit dans la mise à jour, si vous voulez vous moquer de votre BidProposal, vous pourriez vouloir une interface pour que RhinoMocks se moque. Si BidProposal n'implémente pas une interface IBidProposal, en créer une, puis utiliser cette interface (selon la mise à jour de ma réponse). –

0

Rhino soutient des méthodes moqueuse sur les classes concrètes si les méthodes sont déclarées virtuelles. Vous pouvez donc résoudre ce problème en ajoutant le mot clé virtual à chaque déclaration de méthode pour les méthodes que vous souhaitez enregistrer. Vous pouvez également extraire une interface comme suggéré par Andy_Vulhop.

+0

[L'affiche originale (OP)] (http://meta.stackexchange.com/questions/79804/whats-stackexchange-ese-for-op) l'a déjà indiqué dans la mise à jour de la question. –