У нас есть проект MVC4 с Entity Framework для хранения. Для наших тестов мы недавно начали использовать Autofixture, и это действительно потрясающе.
Наш график моделей очень глубок и обычно создает один объект AutoFixture, который создает весь график: Person → Team → Departments → Company → Contracts → .... и т.д.
Проблема с этим - время. Создание объекта занимает до одной секунды. И это приводит к медленным испытаниям.
То, что я нахожу, что я много делаю, это такие вещи:
var contract = fixture.Build<PersonContract>()
.Without(c => c.Person)
.Without(c => c.PersonContractTemplate)
.Without(c => c.Occupation)
.Without(c => c.EmploymentCompany)
.Create<PersonContract>();
И это работает, и это быстро. Но эта сверх-спецификация делает тесты трудными для чтения, и иногда я теряю важные детали, такие как .With(c => c.PersonId, 42)
, в списке несущественных .Without()
.
Все эти игнорируемые объекты являются навигационными свойствами для Entity Framework, и все они являются виртуальными.
Есть ли глобальный способ сказать AutoFixture игнорировать виртуальные члены?
Я попытался создать ISpecimentBuilder
, но не повезло:
public class IgnoreVirtualMembers : ISpecimenBuilder
{
public object Create(object request, ISpecimenContext context)
{
if (request.GetType().IsVirtual // ?? this does not exist )
{
return null;
}
}
}
Я не могу найти способ в ISpecimenBuilder
, чтобы обнаружить, что объект, который мы создаем, является виртуальным членом в другом классе. Вероятно, ISpecimenBuilder
это не подходящее место для этого. Любые другие идеи?