NUnit с исключением Rhino Mocks: почему он выбрасывает это исключение?

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

У меня есть вызов 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.

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

1 ответ

Решение

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

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

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