如何在Autofixture中使用另一个作为源创建对象?

时间:2014-06-18 23:27:26

标签: autofixture

我有这样的事情:

public class ModelEntity : Entity
{
    public override int Id { get; set; }

    public string FileName { get; set; }
}

public class DataTransferObject
{
    public int Id { get; set; }

    public string FileName { get; set; }
}

我想做这样的事情:

var model = _fixture.Create<ModelEntity>(); 
var dto = _fixture.Create<DataTransferObject>().FillWith(model);

现在我正在做以下事情,但我不确定这是否是正确的方法

var model = _fixture.Create<ModelEntity>(); 
var dto = model.AsSource().OfLikeness<DataTransferObject>().CreateProxy();

1 个答案:

答案 0 :(得分:1)

AutoFixture没有这样的功能,但我认为可以从中学到更好的东西:

AutoFixture最初是作为测试驱动开发(TDD)的工具而构建的,TDD完全是关于反馈。本着GOOS的精神,你应该听听你的测试。如果测试难以编写,则应考虑API设计。 AutoFixture倾向于放大这种反馈,也可能就是这种情况。

听起来您需要能够使用DataTransferObject实例中的值填充ModelEntity。这是否表明某种映射会成为您API的重要补充?

根据这些类型的耦合方式,您可以考虑向ModelEntity类添加投影方法:<​​/ p>

public class ModelEntity : Entity
{
    public override int Id { get; set; }

    public string FileName { get; set; }

    public DataTransferObject ToDataTransferObject()
    {
        return new DataTransferObject
        {
            Id = this.Id,
            FileName = this.FileName
        };
    }
}

然而,这种方法的缺点是它将这两种类型相互耦合。

如果您发现不受欢迎,您可以改为引入专用的Mapper服务,该服务可以将ModelEntity实例映射到DataTransferObject对象 - 反之亦然。

如果出于某种不可思议的原因,您不想将这样的Mapper引入您的被测系统,您仍然可以将其作为可重复使用的服务添加到您的测试项目中。

如果您不想自己编写这样的Mapper,可以考虑使用AutoMapper这样的目的。