以下测试失败:
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 _));
}
看起来使用语句 lambda 进行自定义不起作用。
这是预期的行为吗?
如果是,不应该将其添加到某些文档中吗? 我花了很多时间弄清楚出了什么问题......
@progala2感谢您提出问题。
现有行为是设计使然。 原因是FromFactory
、 With
(和Without
)方法是不可变的,所以它们不会改变底层对象。 相反,它们返回一个带有配置图的新对象。
第一个测试不起作用的原因是您没有使用调用的结果,因此所有应用的更改都将被丢弃。 一旦你正确地重写了代码,它也可以很好地处理语句:
```c#
[事实]
公共无效测试1()
{
var fixture = new Fixture();
夹具.定制
{
// 一个 lambda 语句
var res = c.FromFactory(() => new PaymentReturnPayload(fixture.Create)
res = res.With(a => a.OperationAmount, "1");
返回资源;
});
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 _));
}
我明白了,它们是不可变的——现在很清楚了。
感谢您的回答和一些额外的提示!