3

我收到了一个异常,对我来说真的没有任何意义。NUnit与Rhino Mocks异常:为什么抛出此异常?

我有一个带有3个参数的方法的Expect调用:这些类型被称为CallContext,IDal和List。

NUnit抛出2个异常:一个用于不期待在类型为CallContext,System.Object和List时发生的方法调用,另一个用于预期在类型是正确的类型时未发生的调用。有趣的是,只有方式调用的方法是与上述3种类型。没有类型对象的方法调用!

下面是代码:

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); 
} 

被调用的方法是:workbooksLogic.Create(上下文,DAL,新列表{簿}) 下面是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. 

我不知道这是怎么回事。有人有主意吗?

+0

你能证明您遇到的问题的考验吗?此外,测试中使用的类的方法列表(仅限签名)也会有所帮助。 – PatrickSteele 2010-07-14 16:24:51

回答

4

Rhino Mocks使用重载的Equals方法来比较预期的调用和实际发生的调用的参数。有些作为参数提供的对象没有Equals重载(即List类,不知道其他的),所以如果提供的参数具有相同的引用(如此相同的对象)你用来设定期望的那些。

您有几种选择:

  1. 使用IgnoreArguments,这样的论点不会在所有
  2. 检查提供自己的约束,这样就可以检查参数是你所期望的是什么是,但不使用的equals()
  3. 确保这些都是完全一样的对象(如果可能)
+0

#1明白了!谢谢你的帮助! – IronMan84 2010-07-14 16:47:13

相关问题