NUnit с исключением Rhino Mocks: почему он выбрасывает это исключение? - PullRequest
3 голосов
/ 14 июля 2010

Я получаю исключение, которое действительно не имеет для меня никакого смысла.

У меня есть вызов Expect для метода, который принимает 3 аргумента: типы называются CallContext, IDal и List.

NUnit выдает мне 2 исключения: одно для того, чтобы не ожидать вызова метода, который произошел, когда типами являются CallContext, System.Object и List, и одно для ожидания вызова, который не произошел, когда типами являютсяправильные.Самое интересное, что only способ вызова метода - это 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.

Я понятия не имею, что, черт возьми, происходит с этим.У кого-нибудь есть идеи?

1 Ответ

4 голосов
/ 14 июля 2010

Rhino Mocks использует перегруженный метод Equals для сравнения аргументов ожидаемого вызова и фактического вызова.Некоторые объекты, которые вы предоставляете в качестве аргументов, не перегружены Equals (т.е. класс List, не уверен насчет других), поэтому единственный способ будет работать, если предоставленные аргументы имеют те же ссылки (как и те же объекты), что ите, которые вы использовали для установки ожидания.

У вас есть несколько вариантов:

  1. Использовать IgnoreArguments, чтобы аргументы вообще не проверялись
  2. Укажитеваши собственные ограничения, чтобы вы могли проверить, соответствуют ли аргументы ожидаемым, но без использования Equals ()
  3. Убедитесь, что это абсолютно одинаковые объекты (если возможно)
...