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

问题描述 投票:1回答:1

我正在尝试使用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
c# autofixture
1个回答
0
投票

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

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

它应该工作正常。

如果您经常需要该功能,请将register a wish用于AutoFixture库,以便将来实施。

© www.soinside.com 2019 - 2024. All rights reserved.