Следующий тест не проходит:
public class UnitTest1
{
[Fact]
public void Test1()
{
var fixture = new Fixture();
fixture.Customize<PaymentReturnPayload>(c =>
{ // a statement lambda
c.With(a => a.OperationAmount, "1");
c.FromFactory(() => new PaymentReturnPayload(fixture.Create<int>().ToString()));
return c;
});
var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
Assert.True(int.TryParse(paymentReturnPayload.Control, out _));
}
}
public class PaymentReturnPayload
{
public PaymentReturnPayload(string control)
{
Control = control;
}
public string OperationAmount { get; set; }
public string Control
{
get;
}
}
Параметр Control заполняется случайной строкой вместо сгенерированного int.
Версия 4.0 - 4.4 (предыдущие не тестировал)
Чистое ядро 2.0 - 2.1
Это хорошо работает
[Fact]
public void Test1()
{
var fixture = new Fixture();
fixture.Customize<PaymentReturnPayload>(c =>
c.FromFactory(() => new PaymentReturnPayload(fixture.Create<int>().ToString())));
var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
Assert.True(int.TryParse(paymentReturnPayload.Control, out _));
}
Похоже, настройка с использованием лямбда-выражения не работает.
Это ожидаемое поведение?
И если да, не следует ли это добавить в какую-то документацию? Я потерял много времени, выясняя, что не так ...
@ progala2 Спасибо, что подняли вопрос.
Существующее поведение является преднамеренным. Причина в том, что методы FromFactory
, With
(и Without
) неизменяемы, поэтому они не изменяют базовый объект. Вместо этого они возвращают новый объект с настроенным графиком.
Причина, по которой первый тест не работает, заключается в том, что вы не используете результат вызовов, поэтому все примененные изменения отбрасываются. После того, как вы правильно переписываете код, он будет нормально работать и с операторами:
`` С #
[Факт]
public void Test1 ()
{
var fixture = new Fixture ();
приспособление.
{
// выражение лямбда
var res = c.FromFactory (() => new PaymentReturnPayload (fixture.Create
res = res.With (a => a.OperationAmount, "1");
return res;
});
var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
Assert.True(int.TryParse(paymentReturnPayload.Control, out _));
}
But as you might notice, it's easier to write this code with lambda.
P.S. By the way, you can slightly improve the final code (notice the `FromFactory` has overload taking extra values necessary for the object construction):
```c#
[Fact]
public void Test3()
{
var fixture = new Fixture();
fixture.Customize<PaymentReturnPayload>(c =>
c.FromFactory((int control) => new PaymentReturnPayload(control.ToString())));
var paymentReturnPayload = fixture.Create<PaymentReturnPayload>();
Assert.True(int.TryParse(paymentReturnPayload.Control, out _));
}
Я вижу, они неизменны - теперь это ясно.
Спасибо за ответ и несколько дополнительных советов!