代码之家  ›  专栏  ›  技术社区  ›  Corey Adler

NUnit with Rhino Mocks exception:为什么它抛出这个异常?

  •  3
  • Corey Adler  · 技术社区  · 16 年前

    我遇到了一个对我来说毫无意义的例外。

    我对一个包含3个参数的方法有一个Expect调用:类型分别为CallContext、ida和List。

    NUnit抛出了两个异常:一个是在类型为CallContext、System.Object和List的情况下不需要发生方法调用,另一个是在类型正确的情况下不需要发生调用。有趣的是 调用方法的方法是使用上面提到的3种类型。没有类型为object的方法调用!

    代码如下:

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

    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.
    

    我不知道这到底是怎么回事。有人有什么想法吗?

    1 回复  |  直到 16 年前
        1
  •  4
  •   Grzenio    16 年前

    rhinomocks使用重载的Equals方法来比较预期调用和实际发生的调用的参数。作为参数提供的某些对象没有重载Equals(即,List类,不确定其他对象),因此,如果提供的参数与设置期望的参数具有相同的引用(相同的对象也是如此),则唯一可行的方法是。

    1. 使用IgnoreArguments,这样就根本不会检查参数
    2. 提供您自己的约束,这样您就可以检查参数是否符合您的期望,但不必使用Equals()