У меня есть базовый класс, я использую с MSpec который предоставляет удобные методы вокруг AutoMock:Почему это время жизни Autofac mock в простой проверке MSpec?
public abstract class SubjectBuilderContext
{
static AutoMock _container;
protected static ISubjectBuilderConfigurationContext<T> BuildSubject<T>()
{
_container = AutoMock.GetLoose();
return new SubjectBuilderConfigurationContext<T>(_container);
}
protected static Mock<TDouble> GetMock<TDouble>()
where TDouble : class
{
return _container.Mock<TDouble>();
}
}
Иногда я вижу исключение произойдет при попытке извлечь Mock, как так:
It should_store_the_receipt =() => GetMock<IFileService>().Verify(f => f.SaveFileAsync(Moq.It.IsAny<byte[]>(), Moq.It.IsAny<string>()), Times.Once());
Вот исключение:
System.ObjectDisposedExceptionInstances не могут быть решены, и вложенные время жизни не может быть Creat из этого LifetimeScope, поскольку он уже был удален .
Я предполагаю, что это что-то делать с тем, как MSpec проходит испытания (с помощью отражения), и что есть период времени, когда ничего активно не имеют ссылок на любой из объектов в подлежащем пожизненного объема используемого AutoMock, который заставляет lifetimecope удаляться. Что здесь происходит, и есть ли какой-то простой способ избежать этого?
Звучит как e идеально подходит для [MFakes] (https://github.com/machine/Machine.Fakes) для меня. Он должен абстрагироваться от насмешливых фреймворков и их тонкостей. Есть ли причина, по которой вы не используете MFakes? –
Спасибо за рекомендацию. Я могу взглянуть на MFakes более внимательно, но я хотел бы прояснить, что происходит с моим использованием AutoMocks, прежде всего, в надежде не повторить ту же ошибку в другом контексте позже. –