我正在尝试使用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
答案 0 :(得分:0)
AutoFixture确实不支持With()
构建器方法中的索引器。您可以改用Do()
扩展名来解决此问题:
var entity = fixture.Build<EntityWithIndexer>()
.Do(x => x[0] = "Test")
.Create();
应该工作正常。
如果您经常需要该功能,请使用register a wish获取AutoFixture库,以便将来可以实现。