Основная проблема в том, как протестировать докладчика.
Примите:
Доменный объект (в конечном итоге будет сохранен в БД)
Базовые атрибуты: Id (идентификатор БД, Int / GUID / любой другой) и TransientID (локальный идентификатор до сохранения, GUID)
DomainObject
<Code>
namespace domain {
public class DomainObject {
private int _id;
private Guid transientId;
public DomainObject()
{
_transient_Id = Guid.NewGuid();
}
}
}
</Code>
PresenterTest:
var repository = Mock.StrictMock();
var view = Mock.StrictMock();
view.Save += null;
var saveEvent = LastCall.Ignore().GetEventRaiser();
var domainObject = new DomainObject() {Id = 0, Attribute = "Blah"};
Mock.ExpectCall(Repository.Save(domainObject)).Returns(True);
Mock.ReplayAll();
var sut = new Presenter(repository, view);
Save_Event.raise(view, EventArgs.Empty);
Mock.Verify()
Таким образом, проблема в том, что идентификатор объекта домена вычисляется с помощью ID, а если он не рассчитывается с помощью transientID, нет никакого способа узнать, каким будет transientID, поэтому я не могу проверить фиктивный репозиторий на равенство.
Обходные пути на данный момент:
1) LastCall. Игнорируйте и довольствуйтесь jsut-проверкой, что метод вызван, но не проверяйте содержимое вызова.
2) Напишите DTO для проверки и сохранения в сервисе. Служба, которая обрабатывает сопоставление с доменом.
3) Напишите фальшивый testRepository, который использует собственную логику для определения успеха.
- 1 не проверяет большую часть логики. --2 - много лишнего кода без какой-либо цели --3 Кажется потенциально хрупким.
Прямо сейчас я склоняюсь к DTO и сервису в теории, что это дает наибольшую изоляцию между уровнями, но, вероятно, 75% ненужно ...