.NET AutoFixture со сложными дочерними свойствами - PullRequest
0 голосов
/ 07 сентября 2018

Я изучаю использование AutoFixture для создания некоторых наших тестовых данных для модульных тестов. Пока это выглядит так, как будто это сэкономит нам немного кода / обслуживания. Моя единственная проблема сейчас заключается в том, что при создании объекта сложные дочерние объекты на нем не будут соответствующим образом подключаться к идентификаторам. Я пытаюсь найти способ изящно преодолеть это вместо того, чтобы просто вручную подключать идентификаторы после создания объекта. Смотрите пример ниже:

public class Bar
{
    public int Id {get; set;}

    public string Name {get; set;}

    public Foo Foo {get; set;}

    public int FooId {get; set;}
}

public class Foo
{
    public int Id {get; set}

    public string Description {get; set;}
}

В этом примере вызов var myBar = myFixture.Create<Bar>() заполнит все свойства как для Bar, так и для его дочернего свойства Foo. Моя проблема здесь в том, что myBar.FooId будет отличаться от значения для myBar.Foo.Id. Та же проблема существует для создания дочерних коллекций. Как я могу преодолеть это, не подключая вручную все мои идентификаторы?

1 Ответ

0 голосов
/ 07 сентября 2018

Можете ли вы попробовать это:

var obj = myFixture
    .Build<Bar>()
    .Without(b => b.Foo)
    .Without(b => b.FooId)
    .Do(b =>
        {
            b.Foo = fixture.Create<Foo>();
            b.FooId = fixture.Create<int>();
            b.Foo.Id = b.FooId;
        })
    .Create()

Или вы можете проверить этот 3-й пакет , который поддерживает инициализацию навигационных свойств в EF для AutoFixture

Когда перехватчик создает новый навигационный объект, он проверит для соответствующего свойства int ____Id. Если присутствует, он установит Id свойство нового объекта, так что foo.BarId == foo.Bar.Id. Это также применяется, когда имя таблицы включено в свойство Id, поэтому foo.BarId == foo.Bar.BarId.

...