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, не уверен насчет других), поэтому единственный способ будет работать, если предоставленные аргументы имеют те же ссылки (как и те же объекты), что и те, которые вы использовали, чтобы настроить ожидание.
У вас есть несколько вариантов:
- Используйте IgnoreArguments, чтобы аргументы вообще не проверялись
- Укажите свои собственные ограничения, чтобы вы могли проверить, соответствуют ли аргументы ожидаемым, но без использования Equals()
- Убедитесь, что это абсолютно одинаковые объекты (если это возможно)