public void Commit() { using (_mockRepository.Ordered()) { // First run of BeginCommit: fakeChangedPersistableItem, _fakeNewPersistableItem in commit set - event raised for both _dataManagerMock .Expect(mock => mock.GetLoadedDataByObjectState(StateType.Changed, StateType.Deleted, StateType.New)) .Return(new[] { _fakeChangedPersistableItem, _fakeNewPersistableItem }); ExpectTransactionCommitting(_fakeChangedDomainObject, _fakeNewDomainObject); // Second run of BeginCommit: _fakeChangedPersistableItem, _fakeNewPersistableItem, _fakeDeletedPersistableItem in commit set // Event is raised just for _fakeDeletedPersistableItem - the others have already got their event _dataManagerMock .Expect(mock => mock.GetLoadedDataByObjectState(StateType.Changed, StateType.Deleted, StateType.New)) .Return(new[] { _fakeChangedPersistableItem, _fakeNewPersistableItem, _fakeDeletedPersistableItem }); ExpectTransactionCommitting(_fakeDeletedDomainObject); // End of BeginCommit: _fakeNewPersistableItem, _fakeDeletedPersistableItem in commit set - events already raised for all of those _dataManagerMock .Expect(mock => mock.GetLoadedDataByObjectState(StateType.Changed, StateType.Deleted, StateType.New)) .Return(new[] { _fakeNewPersistableItem, _fakeDeletedPersistableItem }); // CommitValidate: _fakeNewPersistableItem, _fakeDeletedPersistableItem in commit set - this is what actually gets committed ExpectTransactionCommitValidate(new[] { _fakeNewPersistableItem, _fakeDeletedPersistableItem }); // Commit _fakeNewPersistableItem, _fakeDeletedPersistableItem found earlier ExpectPersistData(_fakeNewPersistableItem, _fakeDeletedPersistableItem); _dataManagerMock.Expect(mock => mock.Commit()); // Raise event for _fakeNewPersistableItem only, _fakeDeletedPersistableItem was deleted ExpectTransactionCommitted(_fakeNewDomainObject); } _mockRepository.ReplayAll(); _agent.CommitData(); _mockRepository.VerifyAll(); }