Autofixture: FromFactory не работает должным образом

Созданный на 26 окт. 2017  ·  3Комментарии  ·  Источник: AutoFixture/AutoFixture

Привет,

`` С #
[TestFixture]
public class TestAutoFixture {

    public class TestClass
    {
        public string Property { get; set; }
    }

    [Test]
    public void Test()
    {
        var f = new Fixture();
        f.Customize<TestClass>(composer => composer.FromFactory(() => new TestClass { Property = "foobar" }));

        var o = f.Create<TestClass>();

        Assert.That(o.Property, Is.EqualTo("foobar"));
    }
}

`` ''

Этот тест не работает при использовании 4.0.0-rc1 в .NET Core 2
Я думаю, что это либо вводит в заблуждение (или плохо задокументировано), либо не работает .
РЕДАКТИРОВАТЬ: он не сломан, см. Комментарии ниже.

question

Самый полезный комментарий

Что ж, скорее всего проблема в нашей документации ☺️

По умолчанию AutoFixture автоматически заполняет свойства общедоступными сеттерами, если вы не отключите это поведение, установив fixture.OmitAutoProperties = true . Метод composer.FromFactory() позволяет указать, как активировать экземпляр определенного типа, однако свойства будут назначены для объекта позже.

Собственно, правильное использование API AutoFixture зависит от сценария. Наиболее "идиоматическим" использованием в приведенном выше сценарии будет следующее:

`` С #
е. Настроить(c => c
.FromFactory (() => новый TestClass ())
.With (x => x.Property, "foobar"));

or even the simplified one as AutoFixture will automatically pick up that constructor:
```c#
f.Customize<TestClass>(c => c
    .With(x => x.Property, "foobar"));

В качестве альтернативы вы можете просто отключить автоматическое заполнение свойств, если вам это нужно:
`` С #
е. Настроить(c => c
.FromFactory (() => новый TestClass {Property = "foobar"})
.OmitAutoProperties ());

However, in this case, probably, the `Customize<>()` API is an overhead. Instead, it's simpler to use the `fixture.Register()` method as it allows to use the constructed instance "as-is" without any post-processing:

```c#
f.Register(() => new TestClass { Property = "foobar" });

Поначалу может быть сложно понять, какой именно API подходит лучше, но позже все станет проще 😉Все этот API дает гибкость, и в разных сценариях разные варианты выглядят лучше.

Дайте мне знать, если у вас все еще есть вопросы, которые нужно уточнить, и я с радостью вам помогу.

PS Также могут помочь следующие ссылки:

PPS Причина, по которой composer.Without(x => x.Property) работает, заключается в том, что это выражение отключает автоматические свойства для определенного свойства / поля. В этом случае AutoFixture не заменяет начальное значение объекта автоматически созданным.

Все 3 Комментарий

Я заметил, что если я добавлю .Without(_ => _.Property) после метода FromFactory он будет работать так, как задумано.
Я думаю, что это очень нелогично, но, поскольку это не ошибка, мы можем закрыть это.

Что ж, скорее всего проблема в нашей документации ☺️

По умолчанию AutoFixture автоматически заполняет свойства общедоступными сеттерами, если вы не отключите это поведение, установив fixture.OmitAutoProperties = true . Метод composer.FromFactory() позволяет указать, как активировать экземпляр определенного типа, однако свойства будут назначены для объекта позже.

Собственно, правильное использование API AutoFixture зависит от сценария. Наиболее "идиоматическим" использованием в приведенном выше сценарии будет следующее:

`` С #
е. Настроить(c => c
.FromFactory (() => новый TestClass ())
.With (x => x.Property, "foobar"));

or even the simplified one as AutoFixture will automatically pick up that constructor:
```c#
f.Customize<TestClass>(c => c
    .With(x => x.Property, "foobar"));

В качестве альтернативы вы можете просто отключить автоматическое заполнение свойств, если вам это нужно:
`` С #
е. Настроить(c => c
.FromFactory (() => новый TestClass {Property = "foobar"})
.OmitAutoProperties ());

However, in this case, probably, the `Customize<>()` API is an overhead. Instead, it's simpler to use the `fixture.Register()` method as it allows to use the constructed instance "as-is" without any post-processing:

```c#
f.Register(() => new TestClass { Property = "foobar" });

Поначалу может быть сложно понять, какой именно API подходит лучше, но позже все станет проще 😉Все этот API дает гибкость, и в разных сценариях разные варианты выглядят лучше.

Дайте мне знать, если у вас все еще есть вопросы, которые нужно уточнить, и я с радостью вам помогу.

PS Также могут помочь следующие ссылки:

PPS Причина, по которой composer.Without(x => x.Property) работает, заключается в том, что это выражение отключает автоматические свойства для определенного свойства / поля. В этом случае AutoFixture не заменяет начальное значение объекта автоматически созданным.

Большое вам спасибо за этот невероятный ответ! Ты удивительный :)

Была ли эта страница полезной?
0 / 5 - 0 рейтинги