具有独特属性的AutoFixture构建集合

时间:2019-03-26 15:42:37

标签: c# .net autofixture

是否有可能在def visualizar_grid(X_grid, Y_grid, Z_grid, NODATA_value, name_DTM): import numpy as np import matplotlib.pyplot as plt grid = Z_grid for i in range(len(Z_grid)): for j in range(len(Z_grid[0])): if Z_grid[i][j] == NODATA_value: grid[i][j] = grid[i][j]*np.nan plt.matshow(grid[::-1], cmap = 'jet') plt.gca().invert_yaxis() plt.colorbar() plt.grid() plt.title(name_DTM) image = plt.show() return image 中创建具有唯一属性的集合?例如,我想创建以下内容的集合:

AutoFixture

具有唯一的public class Foo { public int Id {get; set;} public string Name {get;set;} } 。看起来像这样:

Id

我知道可以通过定制来实现,但是我认为这是很常见的情况,因此var fixture = new Fixture(); fixture .Build<Foo>() .WithUnique((foo) => foo.Id) .CreateMany(20); 可能已经为此做好了准备吗?

1 个答案:

答案 0 :(得分:1)

默认情况下,自动修复会为属性生成唯一的值。因此,您不必指定哪个属性应该是唯一的-而是为其他属性指定一个非唯一值:

// with AutoFixture.SeedExtensions
fixture.Build<Foo>().With(f => f.Name, fixture.Create("Name")).CreateMany(20)

请注意,如果要确保其他属性的非唯一值(仅具有唯一的ID),则可以为IPostprocessComposer创建简单的扩展名,为该属性提供一组可能的值:

public static IPostprocessComposer<T> With<T, TProperty>(
    this IPostprocessComposer<T> composer,
    Expression<Func<T, TProperty>> propertyPicker,
    IEnumerable<TProperty> possibleValues) =>
      composer.With(propertyPicker, possibleValues.ToArray());

public static IPostprocessComposer<T> With<T, TProperty>(
    this IPostprocessComposer<T> composer,
    Expression<Func<T, TProperty>> propertyPicker,
    params TProperty[] possibleValues)
{
    var rnd = new Random();
    return composer.With(
       propertyPicker,
       () => possibleValues[rnd.Next(0, possibleValues.Length)]);
}

用法很简单-以下代码创建的foo列表只有两个不同的name值和三个不同的整数属性值:

fixture.Build<Foo>()
    .With(f => f.SomeIntegerProperty, 10, 20, 50)
    .With(f => f.Name, fixture.CreateMany<string>(2))
    .CreateMany(20);