2015-11-23 3 views
4

Например, я получил эти частичные классы, сгенерированную EF Database First:Создание EF сущности окурок с AutoFixture

Собака:(EF объекта)

public partial class Dog 
{ 
    public int DogID { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public int PetOwnerID { get; set; } 
    // Navigation property 
    public virtual PetOwner PetOwner { get; set; } 
} 

PetOwner :(EF объект)

public partial class PetOwner 
{ 
    public int PetOwnerID { get; set; } 
    public string PetOwnerName { get; set; } 
    // Navigation property 
    public virtual ICollection<Dog> Dogs { get; set; } 
} 

Мне нужен простой заглушка типа Dog для модульного тестирования. Но когда я пытаюсь создать заглушку с помощью AutoFixture, генерируется исключение рекурсивной зависимости. Если я попытаюсь изменить поведение прибора, как это, он зависает.

var fixture = new Fixture(); 
fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b => fixture.Behaviors.Remove(b)); 
fixture.Behaviors.Add(new OmitOnRecursionBehavior(1)); 
var dog = fixture.Create<Dog>(); 

Мне не нужны никакие функции EF здесь, просто класс со свойствами для тестирования. У меня есть NUnit, Moq, AutoFixture.

UPDATE:

var dog = fixture.Build<Dog>().Without(x => x.PetOwner).Create(); 

Это решает проблему, но мне нужно свойство навигации, чтобы быть не нулевым.

+0

@ Enrico Campidoglio, тест просто не заканчивается. Я пытаюсь собрать больше информации сейчас. – AsValeO

+0

Не обновляйте свой Q, включая ваши ответы внутри него. Если вы найдете рабочий ответ по своему собственному вопросу, ответьте на него сами и признайте его действительным (я думаю, вам нужно подождать пару дней, чтобы сделать это). Это делает его полезным для сообщества. И, если, как в этом случае, вы частично решаете проблему, вы можете отредактировать эту Q, ответить на нее и создать новую Q с новой проблемой. Это немного больше работы, но это намного лучше. – JotaBe

+0

Вам нужна коллекция 'PetOwner.Dogs', которая также будет заполнена? –

ответ

3

Я не смог воспроизвести ошибку. Этот тест проходит нормально, используя AutoFixture 3.36.12:

[Test] 
public void CreateEntityWithNavigationProperty() 
{ 
    var fixture = new Fixture(); 
    fixture.Behaviors.Add(new OmitOnRecursionBehavior()); 

    var dog = fixture.Create<Dog>(); 

    Assert.That(dog.PetOwner, Is.Not.Null); 
    Assert.That(dog.PetOwner.Dogs, Is.Empty); 
} 

Однако, как решить эту проблему, вы можете явно настроить AutoFixture создавать объекты типа PetOwner без заполнения PetOwner.Dogs свойства:

[Test] 
public void CreateEntityWithNavigationProperty() 
{ 
    var fixture = new Fixture(); 
    fixture.Customize<PetOwner>(c => 
     c.With(owner => owner.Dogs, Enumerable.Empty<Dog>())); 

    var dog = fixture.Create<Dog>(); 

    Assert.That(dog.PetOwner, Is.Not.Null); 
    Assert.That(dog.PetOwner.Dogs, Is.Empty); 
} 

Это дает тот же результат, что и предыдущий тест, где свойство PetOwner.Dogs установлено на пустую последовательность, которая равна much better than null.

+0

Большое спасибо, Энрико! Да, теперь у меня это тоже работает. 'Настроить <>' выглядит здорово. У меня все еще есть проблема в моем более сложном коде, со многими зависимостями, я дополнит эту полезную информацию, если найду что-нибудь полезное. – AsValeO

Смежные вопросы