3

Je reçois une exception qui n'a vraiment aucun sens pour moi.Exception NUnit avec Rhino Mocks: pourquoi lève-t-il cette exception?

j'Expect appel à une méthode qui prend 3 arguments en elle: Les types sont appelés CallContext, IDAL et Liste. NUnit me lance 2 exceptions: Une pour ne pas attendre un appel de méthode qui est arrivé où les types sont CallContext, System.Object, et List, et un pour attendre un appel qui n'a pas eu lieu où les types sont les bons . La chose amusante est que le seulement façon d'appeler la méthode est avec les 3 types mentionnés ci-dessus. Il n'y a pas d'appel de méthode avec l'objet type!

Voici le code:

private IDal mockDal; 
private CallContext mockContext; 
private IWorkbooksLogic mockWLogic; 
private ICommercialSpaceLogic mockCLogic; 
private CmWorkbook mockWorkbook; 
private IList<Workbook> mockList; 
private MockRepository mock; 
private Random random; 

[SetUp] 
public void Setup() { 
    mock = new MockRepository(); 
    random = new Random(); 
    this.mockDal = mock.StrictMock<IDal>() as IDal; 
    this.mockContext = new CallContext(); 
    this.mockWLogic = mock.StrictMock<IWorkbooksLogic>() as IWorkbooksLogic; 
    this.mockCLogic = mock.StrictMock<ICommercialSpaceLogic>() as ICommercialSpaceLogic; 
    this.mockWorkbook = new CmWorkbook(); 
    this.mockList = mock.StrictMock<IList<Workbook>>() as IList<Workbook>; 
} 

[Test] 
public void ShouldFailWhenCreateWorkbookFails() { 

    int randBudget = random.Next(50); 
    int randEntity = random.Next(50); 
    int randWork = random.Next(50); 

    WorkbookDefinitions work = new WorkbookDefinitions { 
    WorkbookDefinitionID = randWork 
    }; 

    Budget budget = new Budget { 
    BudgetID = randBudget, 
    WorkbookDefinitions = new List<WorkbookDefinitions> { work },  
    }; 

    CommercialProperty property = new CommercialProperty { 
    CommercialPropertyID = randEntity, 
    CMEntity = new CMEntity { 
     EntityBase = new EntityEntity { EntityCode = "random.Next(50)" } 
    } 
    }; 

    CmWorkbook book = new CmWorkbook { 
    WorkbookName = String.Format("CM — {0}", property.CMEntity.EntityBase.EntityCode) 
    }; 

    OperationResults results = new OperationResults(); 
    this.mockList.Add(book); 
    using (mock.Record()) { 
    Expect.On(this.mockDal).Call(this.mockDal.GetObject<Budget, int>(randBudget)).Return(budget); 
    Expect.On(this.mockDal).Call(this.mockDal.GetObject<CommercialProperty, int>(randEntity)).Return(property); 
    Expect.On(this.mockWLogic).Call(this.mockWLogic.Create(this.mockContext, this.mockDal, this.mockList)).Return(null); 
    } 
    using (mock.Playback()) { 
    results = CmWorkbookLogic.CreateWorkbook(mockContext, mockDal, mockWLogic, mockCLogic, randBudget, randEntity); 
    } 
    Assert.IsFalse(results.AllSuccessful); 
} 

La méthode appelée est: workbooksLogic.Create (contexte, dal, nouvelle liste {classeur}) Voici l'erreur NUnit:

ShouldFailWhenCreateWorkbookFails: 
Rhino.Mocks.Exceptions.ExpectationViolationException : ICRUDBaseLogic`1.Create(CallContext, System.Object, System.Collections.Generic.List`1[Workbook]); Expected #0, Actual #1. 
ICRUDBaseLogic`1.Create(CallContext, IDalProxy8768e63f86da4601993b4791c696ada6, System.Collections.Generic.List`1[Workbook]); Expected #1, Actual #0. 

Je n'ai aucune idée de ce qui se passe avec ça. Quelqu'un a des idées?

+0

exactement les mêmes objets pourraient vous montrer le test que vous rencontrez un problème avec? En outre, une liste des méthodes (signatures seulement) des classes utilisées dans votre test aiderait aussi. – PatrickSteele

Répondre

4

Rhino Mocks utilise la méthode equals surchargée de comparer les arguments de l'appel attendu et l'invocation qui est réellement passé. Certains objets que vous fournissez en tant qu'arguments ne sont pas surchargés par Equals (c'est-à-dire classe List, pas sûr des autres), donc la seule façon de fonctionner si les arguments fournis avaient les mêmes références (donc les mêmes objets) ceux que vous avez utilisés pour mettre en place l'attente.

Vous avez quelques options:

  1. Utilisez IgnoreArguments, de sorte que les arguments ne seront pas contrôlés à tous les
  2. Fournir vos propres contraintes, de sorte que vous pouvez vérifier si les arguments sont ce que vous attendez à être, mais sans utiliser Equals()
  3. Assurez-vous que ce sont (si possible)
+0

# 1 l'ai eu! Merci de votre aide! – IronMan84