【问题标题】:NUnit with Rhino Mocks exception: Why is it throwing this exception?带有 Rhino Mocks 异常的 NUnit:为什么会抛出这个异常?
【发布时间】:2010-07-14 16:02:36
【问题描述】:

我遇到了一个对我来说真的毫无意义的异常。

我有一个对一个方法的 Expect 调用,该方法接受 3 个参数:这些类型称为 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(context, dal, new List { workbook }) 这是 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.

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

【问题讨论】:

  • 您能否展示您遇到问题的测试?此外,测试中使用的类的方法列表(仅限签名)也会有所帮助。

标签: nunit rhino-mocks nunit-console rhino-mocks-3.5 nunit-mocks


【解决方案1】:

Rhino Mocks 使用重载的 Equals 方法来比较预期调用和实际调用的参数。您作为参数提供的某些对象没有重载 Equals(即 List 类,不确定其他对象),因此,如果提供的参数具有相同的引用(相同的对象也是如此),那么唯一的方法是那些你用来设定期望的人。

你有几个选择:

  1. 使用 IgnoreArguments,这样就根本不会检查参数
  2. 提供您自己的约束,以便您可以检查参数是否符合您的预期,但无需使用 Equals()
  3. 确保这些是完全相同的对象(如果可能)

【讨论】:

  • #1 明白了!感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 2011-07-19
  • 1970-01-01
相关资源
最近更新 更多