Autofixture: 使用声明 lambda 进行自定义不起作用 - 这是预期的吗?

创建于 2018-06-07  ·  2评论  ·  资料来源: AutoFixture/AutoFixture

以下测试失败:

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 进行自定义不起作用。
这是预期的行为吗?
如果是,不应该将其添加到某些文档中吗? 我花了很多时间弄清楚出了什么问题......

question

所有2条评论

@progala2感谢您提出问题。

现有行为是设计使然。 原因是FromFactoryWith (和Without )方法是不可变的,所以它们不会改变底层对象。 相反,它们返回一个带有配置图的新对象。

第一个测试不起作用的原因是您没有使用调用的结果,因此所有应用的更改都将被丢弃。 一旦你正确地重写了代码,它也可以很好地处理语句:

```c#
[事实]
公共无效测试1()
{
var fixture = new Fixture();
夹具.定制(c =>
{
// 一个 lambda 语句
var res = c.FromFactory(() => new PaymentReturnPayload(fixture.Create)().ToString()));
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 _));
}

我明白了,它们是不可变的——现在很清楚了。
感谢您的回答和一些额外的提示!

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Ridermansb picture Ridermansb  ·  4评论

joelleortiz picture joelleortiz  ·  4评论

zvirja picture zvirja  ·  8评论

DeafLight picture DeafLight  ·  5评论

zvirja picture zvirja  ·  4评论