Я знаю, что немного опаздываю на вечеринку, но я просто решил это для проекта, над которым я работаю, и решил поделиться своим решением.
Во-первых, чтобы сделать решение более re-usable, я создал базовый класс со свойствами timestamp:
public class EntityBase
{
public DateTime? CreatedDate { get; set; }
public DateTime? LastModifiedDate { get; set; }
}
Затем я переопределил метод SaveChanges в моем DbContext:
public class MyContext : DbContext
{
public override int SaveChanges()
{
ObjectContext context = ((IObjectContextAdapter)this).ObjectContext;
//Find all Entities that are Added/Modified that inherit from my EntityBase
IEnumerable<ObjectStateEntry> objectStateEntries =
from e in context.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified)
where
e.IsRelationship == false &&
e.Entity != null &&
typeof(EntityBase).IsAssignableFrom(e.Entity.GetType())
select e;
var currentTime = DateTime.Now;
foreach (var entry in objectStateEntries)
{
var entityBase = entry.Entity as EntityBase;
if (entry.State == EntityState.Added)
{
entityBase.CreatedDate = currentTime;
}
entityBase.LastModifiedDate = currentTime;
}
return base.SaveChanges();
}
}
Исключение вызвано тем, что вы вызвали члена в строгом издевательстве
IMyClassLogger logger = MockRepository.GenerateStrictMock<IMyClassLogger>(); //<-- Strict Mock here
, для которого не определены ожидания.
Вы вызываете
_database = new Database(_logger.BaseLogger);
в конструкторе, но не ожидаете, что он будет вызван, поэтому вы получите ExpectationViolationException
для IMyClassLogger.get_BaseLogger()
, как указано в сообщении об исключении
[TestMethod]
public void Ctor_ValidParams_CreatesObject()
{
// Arrange
ILogger baseLogger = MockRepository.GenerateMock<ILogger>();
IMyClassLogger logger = MockRepository.GenerateStrictMock<IMyClassLogger>();
logger.Stub(_ => _.BaseLogger).Return(baseLogger);
// Act
var result = new MyClassDataAccess(logger);
// Assert
Assert.IsNotNull(result);
}