自动混合,使用交替键

时间:2016-05-29 15:10:59

标签: c# dictionary autofixture

我需要一个字典列表,每个字典应包含已知数量的字符串,字符串对,键是确定性的,但值应该是随机字符串,列表中的每个字典必须具有相同的键。 一些背景信息:字符串,字符串对表示包含产品实体的数据库表中的值,我使用字典向我的testdatabase添加新行。要创建两行,我需要两个字典,如下所示:

new Dictionary<string, string>() { { "productno", "1001" }, { "productname", "testproduct" } };
new Dictionary<string, string>() { { "productno", "1002" }, { "productname", "testproduct2" } };

productno和productname是列名,以及词典中的键。

我按照评论中的指示尝试var dicts = new Fixture().Create<List<IDictionary<string, string>>>();,它给出了三个字典的列表,每个字典都有一个GUID作为键,一个随机字符串作为值。 当键是确定性的时候,如何正确填充词典的键?

我目前的解决方案有些冗长,但附加的好处是它可以生成任意类型的随机值(但不测试除字符串以外的其他类型)。 它只使用Autofixture来填充随机值,但是很想知道Autofixture中是否有内容可以做同样的事情。我现在拥有的:

public SqlReaderFixtureBuilder AddRows(string table, string[] columns, Type[] types, int no)
{
    var fixture = new Fixture();

    for (int rowno = 0; rowno < no; rowno++)
    {
        if (!tablerows.ContainsKey(table))
            tablerows[table] = new List<Dictionary<string, object>>();

        var values = new Dictionary<string, object>();
        for (int i = 0; i < columns.Length; i++)
        {
            values[columns[i]] = new SpecimenContext(fixture).Resolve(types[i]);
        }
        tablerows[table].Add(values);
    }
    return this;
}

调用它:AddRows("products", new[] { "productno", "productname" }, new[] { typeof(string), typeof(string) }, 30)

1 个答案:

答案 0 :(得分:3)

使用确定性密钥创建字典相当容易。由于键不是匿名值,因此最好在AutoFixture之外创建它们,并将它们与AutoFixture创建的值合并:

var fixture = new Fixture();
var columns = new[] { "productno", "productname" };
var values = fixture.Create<Generator<string>>();

var dict = columns
    .Zip(values, Tuple.Create)
    .ToDictionary(t => t.Item1, t => t.Item2);

这将创建一个词典(dict),其中包含columns中两个键的值。

您可以在ICustomization Dictionary<string, string>中打包这样的内容,这意味着当您请求多个Dictionary<string, string>值时,您将获得多个字典,就像这样