为类型创建AutoFixture样本构建器

Mat*_*cek 12 c# autofixture

在这种情况下,我正在为特定类型创建一个AutoFixture样本构建器System.Data.DataSet.构建器将返回a FakeDataSet,这是DataSet为测试而定制的.

以下不起作用,dataSet总是返回null,即使DataSet正在请求a(我可以通过钻取request属性来判断).

public class DataSetBuilder : ISpecimenBuilder
{
    public object Create(object request, ISpecimenContext context)
    {
        var dataSet = request as DataSet;
        if (dataSet == null)
        {
            return new NoSpecimen(request);
        }

        return new FakeDataSet();
    }
}
Run Code Online (Sandbox Code Playgroud)

这种变化确实有效,但似乎过于复杂.感觉有更好的方法来完成同样的事情,我只是缺少一些东西.

public class DataSetBuilder : ISpecimenBuilder
{
    public object Create(object request, ISpecimenContext context)
    {
        var seededRequest = request as SeededRequest;
        if (seededRequest == null)
        {
            return new NoSpecimen(request);
        }

        var requestType = seededRequest.Request as Type;
        if (requestType == null)
        {
            return new NoSpecimen(request);
        }

        if (requestType.Name != "DataSet")
        {
            return new NoSpecimen(request);
        }

        return new FakeDataSet();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ann 17

这样做会更简单:

fixture.Register<DataSet>(() => new FakeDataSet());
Run Code Online (Sandbox Code Playgroud)

但是如果你使用SpecimenBuilder,这也应该有效:

public class DataSetBuilder : ISpecimenBuilder
{
    public object Create(object request, ISpecimenContext context)
    {
        var t = request as Type;
        if (typeof(DataSet).Equals(t))
            return new FakeDataSet();

        return new NoSpecimen(request);
    }
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,我会使用第一个选项.

  • 我同意,使用Register是要走的路.谢谢! (2认同)