通过AutoFixture通过索引器设置自定义值

时间:2018-06-20 09:36:03

标签: c# autofixture

我正在尝试使用Fixture.Build用索引器创建对象。不幸的是,我遇到了错误,无法弄清楚该怎么做。

代码示例:

public class EntityWithIndexer
{
    private List<string> _list = new List<string>();

    public string this[int index]
    {
        get => _list[index];
        set => _list[index] = value;
    }
}

public class set_indexed_property_value_example
{
    [Fact]
    public void run_test()
    {
        var fixture = new Fixture();

        var entity = fixture.Build<CombinationsChangesToDirectChangesSpecs.EntityWithIndexer>()
            .With(x => x[0], "Test")
            .Create();

        Assert.Equal("Test", entity[0]);
    }
}

运行测试时,引发以下异常:

System.ArgumentException
The expression's Body is not a MemberExpression. Most likely this is because it does not represent access to a property or field.
Parameter name: propertyPicker
   at AutoFixture.Kernel.ExpressionReflector.GetWritableMember(LambdaExpression propertyPicker) in C:\projects\autofixture\Src\AutoFixture\Kernel\ExpressionReflector.cs:line 19
   at AutoFixture.Kernel.ExpressionReflector.VerifyIsNonNestedWritableMemberExpression(LambdaExpression expression) in C:\projects\autofixture\Src\AutoFixture\Kernel\ExpressionReflector.cs:line 37
   at AutoFixture.Dsl.NodeComposer`1.With[TProperty](Expression`1 propertyPicker, TProperty value) in C:\projects\autofixture\Src\AutoFixture\Dsl\NodeComposer.cs:line 329
   at AutoFixture.Dsl.CompositeNodeComposer`1.c__DisplayClass12_0`1.b__0(ISpecimenBuilderNode n) in C:\projects\autofixture\Src\AutoFixture\Dsl\CompositeNodeComposer.cs:line 324
   at AutoFixture.Kernel.SpecimenBuilderNode.c__DisplayClass4_0.b__1(f__AnonymousType4`2 h__TransparentIdentifier0) in C:\projects\autofixture\Src\AutoFixture\Kernel\SpecimenBuilderNode.cs:line 157
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at AutoFixture.Kernel.CompositeSpecimenBuilder.Compose(IEnumerable`1 builders) in C:\projects\autofixture\Src\AutoFixture\Kernel\CompositeSpecimenBuilder.cs:line 67
   at AutoFixture.Kernel.SpecimenBuilderNode.c__DisplayClass4_0.b__1(f__AnonymousType4`2 h__TransparentIdentifier0) in C:\projects\autofixture\Src\AutoFixture\Kernel\SpecimenBuilderNode.cs:line 157
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at AutoFixture.Kernel.CompositeSpecimenBuilder.ComposeIfMultiple(IEnumerable`1 builders) in C:\projects\autofixture\Src\AutoFixture\Kernel\CompositeSpecimenBuilder.cs:line 107
   at AutoFixture.Kernel.RecursionGuard.Compose(IEnumerable`1 builders) in C:\projects\autofixture\Src\AutoFixture\Kernel\RecursionGuard.cs:line 285
   at AutoFixture.Kernel.SpecimenBuilderNode.c__DisplayClass4_0.b__1(f__AnonymousType4`2 h__TransparentIdentifier0) in C:\projects\autofixture\Src\AutoFixture\Kernel\SpecimenBuilderNode.cs:line 157
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.d__25`1.MoveNext()
   at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source)
   at AutoFixture.Dsl.CompositeNodeComposer`1.Compose(IEnumerable`1 builders) in C:\projects\autofixture\Src\AutoFixture\Dsl\CompositeNodeComposer.cs:line 390
   at AutoFixture.Dsl.CompositeNodeComposer`1.With[TProperty](Expression`1 propertyPicker, TProperty value) in C:\projects\autofixture\Src\AutoFixture\Dsl\CompositeNodeComposer.cs:line 0
   at set_indexed_property_value_example.run_test() in indexer_example.cs:line 29

1 个答案:

答案 0 :(得分:0)

AutoFixture确实不支持With()构建器方法中的索引器。您可以改用Do()扩展名来解决此问题:

var entity = fixture.Build<EntityWithIndexer>()
    .Do(x => x[0] = "Test")
    .Create();

应该工作正常。

如果您经常需要该功能,请使用register a wish获取AutoFixture库,以便将来可以实现。