15

在这种情况下,我正在为特定类型创建 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();
    }
}

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

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();
    }
}
4

1 回答 1

27

这样做会更简单:

fixture.Register<DataSet>(() => new FakeDataSet());

但如果你使用 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);
    }
}

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

于 2013-05-01T17:44:17.450 回答