Прежде чем начать, я большой поклонник AutoFixture, я все еще нахожусь в основе обучения этому инструменту. Так что спасибо за разработку Autofixture Mr Ploeh и всех участников.
Итак, начнем с моего вопроса.
Согласно AutoFixture/AutoMoq игнорирует введенный экземпляр/замороженный макет
Интересной частью приведенной ссылки является данный код
Mock<ISettings> settingsMock = new Mock<ISettings>();
settingsMock.Setup(s => s.Get(settingKey)).Returns(xmlString);
ISettings settings = settingsMock.Object;
fixture.Inject(settings);
На что Марк отвечает, можно переписать на
fixture.Freeze<Mock<ISettings>>()
.Setup(s => s.Get(settingKey)).Returns(xmlString);
Похоже, что синтаксический сахар, используя метод "замораживания", - это способ свободно писать интерфейс, создавая макет, конфигурацию и инъекцию в контейнере для автоматической сборки.
После некоторых исследований в Интернете на самом деле существует функциональное различие между Freeze и Inject. Я нашел этот вопрос: https://github.com/AutoFixture/AutoFixture/issues/59 которые указывают на Как заморозить нулевой экземпляр в AutoFixture
Автор ссылки выше описывает метод Freeze следующим образом:
Внутри, Freeze создает экземпляр запрашиваемого типа (например, IPayPalConfiguration), а затем вводит его, чтобы он всегда возвращался этот экземпляр, когда вы запрашиваете его снова
Я понимаю, что когда мы делаем
var customer = fixture.Freeze<Order>();
он всегда будет использовать тот же экземпляр Order, когда наш код запрашивает тип Order. Но что, если я укажу в конструкторе Freeze, что я хочу, чтобы он использовал конкретный экземпляр?
Вот пример небольшого кода:
[Fact]
public void MethodeName()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
fixture.Freeze<OrderLine>(new OrderLine("Foo"));
var order = fixture.Create<Order>();
}
public class Order
{
private readonly OrderLine _line;
public Order(OrderLine line)
{
_line = line;
}
}
public class OrderLine
{
private readonly string _name;
public OrderLine(string name)
{
_name = name;
}
}
Не должно ли имя OrderLine быть равно "Foo" вместо namefe48163a-d5a0-49a5-b349-7b11ba5f804b? В документации по методу замораживания говорится:
<typeparam name="T">The type to freeze.</typeparam>
<param name="fixture">The fixture.</param>
<param name="seed">Any data that adds additional information when creating the anonymous object. Hypothetically, this value might be the value being frozen, but this is not likely.</param>
Почему автор не уверен, когда возвращается значение? Если я укажу, мой экземпляр в конструкторе Freeze, я ожидаю, что autofixture будет использовать этот экземпляр?
затем
Обратите внимание, что оно вряд ли будет использоваться как замороженное значение, если вы не настроили его. Если вы хотите ввести конкретное значение в Fixture, вы должны использовать этот метод вместо этого. `
Кажется, мне нужно настроить параметр seed. Может ли кто-нибудь уточнить? Решение, указанное в документации, заключается в использовании метода Inject. И действительно, он работает в моем примере кода с OrderLine.
Я ищу вашу помощь, чтобы понять разницу между Freeze, Inject, а также Register, который, согласно исходному коду, просто вызывается методом Inject, но требует лямбда.