AutoFixture создает нежелательную глубину в сложных объектахC#

Место общения программистов C#
Ответить
Anonymous
 AutoFixture создает нежелательную глубину в сложных объектах

Сообщение Anonymous »

У меня есть сложный график из EF6 (сначала база данных), который я хочу смоделировать с помощью макетов и тестовых приспособлений при тестировании моей модели предметной области. Чтобы предотвратить проблемы с циклическими зависимостями, я добавил в настройки теста следующие строки:

Код: Выделить всё

private Fixture _fixture;
public WhenRetrievingPlans()
{
_fixture = new Fixture();
_fixture.Behaviors.OfType().ToList()
.ForEach(b => _fixture.Behaviors.Remove(b));
_fixture.Behaviors.Add(new OmitOnRecursionBehavior());
using (var writer = new StreamWriter(@"D:\Workspace\Project\source\Project.Model.Test\trace.txt"))
{
_fixture.Behaviors.Add(new TracingBehavior(writer));
а затем я пытаюсь не дать приспособлению попытаться преследовать граф объекта в небытие, и просто создаю простой объект без каких-либо дочерних элементов, вот так:

Код: Выделить всё

        _fixture.Build()
.Without(e => e.ObjectProperty1)
.Without(e => e.ObjectProperty2)
.Without(e => e.CollectionProperty3)
.Without(e => e.CollectionProperty4)
.Without(e => e.ObjectProperty5)
...
.Create();
Чтобы не создавались объекты или коллекции, являющиеся свойствами этого EntityType. Остальные свойства представляют собой простые типы, включая некоторые значения Nullable и DateTime, а также типы Int32 и String.

Я хочу, чтобы AutoFixture создал экземпляр EntityType, а затем я планирую вернуть это из Mock. (Это может быть неактуально.)

Код: Выделить всё

        var entitiesDbSetMock = new Mock();
entitiesDbSetMock.SetupAllProperties();
_fixture.Inject(entitiesDbSetMock.Object);
Затем я добавляю объект в этот макет:

Код: Выделить всё

        var entity = _fixture.Create();
entitiesDbSetMock.Object.Attach(entity);
Проблема в следующем: AutoFixture не прекращает генерировать все возможные объекты, к которым можно получить доступ из этого EntityType, даже со всеми .Without() операции, которые я использовал. Откуда мне знать? Потому что я включил трассировку. Только для этой операции Create генерируется около 750 000 строк трассировки (это файл размером 100 МБ).

При чтении трассировки в первом разделе показано создание EntityType. и настройка всех свойств, которые я не исключил. Но сразу после того, как эта вещь будет создана, она, похоже, будет создана снова, но на этот раз она игнорирует мои настройки Without() и уходит глубже.

Код: Выделить всё

Requested: Ploeh.AutoFixture.Kernel.SeededRequest
Requested: Project.Data.EntityType
Requested: Int32 EntityTypeID
Requested: Ploeh.AutoFixture.Kernel.SeededRequest
Requested: System.Int32
Created: 232
Created: 232
Created: 232
Requested: System.Nullable`1[System.Int32] ForeignKey1ID
Requested: Ploeh.AutoFixture.Kernel.SeededRequest
Requested: System.Nullable`1[System.Int32]
Requested: Int32 value
Requested: Ploeh.AutoFixture.Kernel.SeededRequest
Requested: System.Int32
Created: 224
Created: 224
Created: 224
Created: 224
Created: 224
Created: 224
Requested: Int32 Property2ID
Requested: Ploeh.AutoFixture.Kernel.SeededRequest
Requested: System.Int32
Created: 40
Created: 40
Created: 40
Requested: System.DateTime Property3Date
Requested: Ploeh.AutoFixture.Kernel.SeededRequest
Requested: System.DateTime
Created: 6/6/2014 4:05:24 PM
Created: 6/6/2014 4:05:24 PM
Created: 6/6/2014 4:05:24 PM
*... (similar lines elided for brevity)*
Requested: Project.Data.OtherEntity OtherEntity
Created: Ploeh.AutoFixture.Kernel.OmitSpecimen
Requested: Project.Data.YetAnotherEntity YetAnotherEntity
Created: Ploeh.AutoFixture.Kernel.OmitSpecimen
Requested: System.Collections.Generic.ICollection`1[Project.Data.CollectionEntity] CollectionEntities
Created: Ploeh.AutoFixture.Kernel.OmitSpecimen
*... (similar lines elided for brevity)*
Created: Project.Data.EntityType
Created: Project.Data.EntityType
Я ожидаю, что трассировка будет завершена. Объект был создан именно так, как я хотел. Но это еще не все. Сразу после этого я вижу, что AutoFixture продолжает работать.

Код: Выделить всё

Requested: Ploeh.AutoFixture.Kernel.SeededRequest
Requested: Project.Data.YetAnotherEntity
Created: Project.Data.YetAnotherEntity
Created: Project.Data.YetAnotherEntity
Requested: Ploeh.AutoFixture.Kernel.SeededRequest
Requested: Project.Data.UnrelatedEntity
Created: Project.Data.UnrelatedEntity
Created: Project.Data.UnrelatedEntity
Requested: Ploeh.AutoFixture.Kernel.SeededRequest
Requested: Project.Data.EntityType  *

Подробнее здесь: [url]https://stackoverflow.com/questions/31171606/autofixture-creating-unwanted-depth-in-complex-objects[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»