Привет,
`` С #
[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
Я думаю, что это либо вводит в заблуждение (или плохо задокументировано), либо не работает .
РЕДАКТИРОВАТЬ: он не сломан, см. Комментарии ниже.
Я заметил, что если я добавлю .Without(_ => _.Property)
после метода FromFactory
он будет работать так, как задумано.
Я думаю, что это очень нелогично, но, поскольку это не ошибка, мы можем закрыть это.
Что ж, скорее всего проблема в нашей документации ☺️
По умолчанию AutoFixture автоматически заполняет свойства общедоступными сеттерами, если вы не отключите это поведение, установив fixture.OmitAutoProperties = true
. Метод composer.FromFactory()
позволяет указать, как активировать экземпляр определенного типа, однако свойства будут назначены для объекта позже.
Собственно, правильное использование API AutoFixture зависит от сценария. Наиболее "идиоматическим" использованием в приведенном выше сценарии будет следующее:
`` С #
е. Настроить
.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"));
В качестве альтернативы вы можете просто отключить автоматическое заполнение свойств, если вам это нужно:
`` С #
е. Настроить
.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 не заменяет начальное значение объекта автоматически созданным.
Большое вам спасибо за этот невероятный ответ! Ты удивительный :)
Самый полезный комментарий
Что ж, скорее всего проблема в нашей документации ☺️
По умолчанию AutoFixture автоматически заполняет свойства общедоступными сеттерами, если вы не отключите это поведение, установив
fixture.OmitAutoProperties = true
. Методcomposer.FromFactory()
позволяет указать, как активировать экземпляр определенного типа, однако свойства будут назначены для объекта позже.Собственно, правильное использование API AutoFixture зависит от сценария. Наиболее "идиоматическим" использованием в приведенном выше сценарии будет следующее:
`` С #(c => c
е. Настроить
.FromFactory (() => новый TestClass ())
.With (x => x.Property, "foobar"));
В качестве альтернативы вы можете просто отключить автоматическое заполнение свойств, если вам это нужно:(c => c
`` С #
е. Настроить
.FromFactory (() => новый TestClass {Property = "foobar"})
.OmitAutoProperties ());
Поначалу может быть сложно понять, какой именно API подходит лучше, но позже все станет проще 😉Все этот API дает гибкость, и в разных сценариях разные варианты выглядят лучше.
Дайте мне знать, если у вас все еще есть вопросы, которые нужно уточнить, и я с радостью вам помогу.
PS Также могут помочь следующие ссылки:
PPS Причина, по которой
composer.Without(x => x.Property)
работает, заключается в том, что это выражение отключает автоматические свойства для определенного свойства / поля. В этом случае AutoFixture не заменяет начальное значение объекта автоматически созданным.