【问题标题】:Set custom value via indexer by AutoFixtureAutoFixture 通过索引器设置自定义值
【发布时间】:2018-06-20 09:36:02
【问题描述】:

我正在尝试使用带有 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 表达式的 Body 不是 MemberExpression。这很可能是因为它不代表对属性或字段的访问。 参数名称:propertyPicker 在 C:\projects\autofixture\Src\AutoFixture\Kernel\ExpressionReflector.cs:line 19 中的 AutoFixture.Kernel.ExpressionReflector.GetWritableMember(LambdaExpression propertyPicker) 在 C:\projects\autofixture\Src\AutoFixture\Kernel\ExpressionReflector.cs:line 37 中的 AutoFixture.Kernel.ExpressionReflector.VerifyIsNonNestedWritableMemberExpression(LambdaExpression 表达式) 在 AutoFixture.Dsl.NodeComposer`1.With[TProperty](Expression`1 propertyPicker, TProperty value) 在 C:\projects\autofixture\Src\AutoFixture\Dsl\NodeComposer.cs:line 329 在 AutoFixture.Dsl.CompositeNodeComposer`1.c__DisplayClass12_0`1.b__0(ISpecimenBuilderNode n) 在 C:\projects\autofixture\Src\AutoFixture\Dsl\CompositeNodeComposer.cs:line 324 在 AutoFixture.Kernel.SpecimenBuilderNode.c__DisplayClass4_0.b__1(f__AnonymousType4`2 h__TransparentIdentifier0) 在 C:\projects\autofixture\Src\AutoFixture\Kernel\SpecimenBuilderNode.cs:line 157 在 System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 在 System.Linq.Buffer`1..ctor(IEnumerable`1 源) 在 System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 源) 在 AutoFixture.Kernel.CompositeSpecimenBuilder.Compose(IEnumerable`1 builder) 在 C:\projects\autofixture\Src\AutoFixture\Kernel\CompositeSpecimenBuilder.cs:line 67 在 AutoFixture.Kernel.SpecimenBuilderNode.c__DisplayClass4_0.b__1(f__AnonymousType4`2 h__TransparentIdentifier0) 在 C:\projects\autofixture\Src\AutoFixture\Kernel\SpecimenBuilderNode.cs:line 157 在 System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 在 AutoFixture.Kernel.CompositeSpecimenBuilder.ComposeIfMultiple(IEnumerable`1 builder) 在 C:\projects\autofixture\Src\AutoFixture\Kernel\CompositeSpecimenBuilder.cs:line 107 在 C:\projects\autofixture\Src\AutoFixture\Kernel\RecursionGuard.cs:line 285 中的 AutoFixture.Kernel.RecursionGuard.Compose(IEnumerable`1 builders) 在 AutoFixture.Kernel.SpecimenBuilderNode.c__DisplayClass4_0.b__1(f__AnonymousType4`2 h__TransparentIdentifier0) 在 C:\projects\autofixture\Src\AutoFixture\Kernel\SpecimenBuilderNode.cs:line 157 在 System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 在 System.Linq.Enumerable.d__25`1.MoveNext() 在 System.Linq.Enumerable.Count[TSource](IEnumerable`1 源) 在 AutoFixture.Dsl.CompositeNodeComposer`1.Compose(IEnumerable`1 builders) 在 C:\projects\autofixture\Src\AutoFixture\Dsl\CompositeNodeComposer.cs:line 390 在 AutoFixture.Dsl.CompositeNodeComposer`1.With[TProperty](Expression`1 propertyPicker, TProperty value) 在 C:\projects\autofixture\Src\AutoFixture\Dsl\CompositeNodeComposer.cs:line 0 在 indexer_example.cs:line 29 中的 set_indexed_property_value_example.run_test()

【问题讨论】:

    标签: c# autofixture


    【解决方案1】:

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

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

    它应该可以正常工作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      相关资源
      最近更新 更多