如何在C#中生成const或测试数据?

时间:2009-09-29 19:37:24

标签: c#

我倾向于使用boost / unit_test编写大量测试,我倾向于生成大量的const数据 - 例如

#include <vector>
#include <map>
#include <string>

#include <boost/assign.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/assign/std/vector.hpp>
#include <boost/assign/std/map.hpp>

namespace ba = boost::assign;
using namespace std;

const vector<int> my_vector_of_ints = ba::list_of(15)(23)(43)(22)(5)(78);
const map<int, string> my_map = ba::map_list_of(5, "abc")(7, "ddd");

等。等等。

我如何在C#中使用这些东西?

6 个答案:

答案 0 :(得分:3)

尝试这样的事情:

readonly List<int> myListOfInts 
    = new List<int> { 15, 23, 43, 22, 5, 78 };
readonly Dictionary<int, string> myMap 
    = new Dictionary<int, string> { { 5, "abc" }, { 7, "ddd" } };

现在C#的const与C ++的const并不是一回事,所以你需要意识到这些实例是可变的。我已将这些字段标记为readonly,这与您将获得的内容差不多。

答案 1 :(得分:2)

在C#3中,您可以使用collection initializers

public static class TestData
{
    public static readonly List<int> my_vector_of_ints 
       = new List<int> { 15, 24, 43, 22, 5, 78 };

    public static readonly Dictionary<int,string> my_map 
       = new Dictionary<int,string> { {5, "abc"}, {7, "ddd" } };
}

答案 2 :(得分:1)

static readonly ReadOnlyCollection<int> MyInts = new ReadOnlyCollection<int>(new int[] {
    15, 23, 43, 22, 5, 78
});

不幸的是,.Net没有只读字典类型。

您可以使用这样的可变字典,但如果您将字典公开给其他代码,其他代码将能够添加或删除其中的条目。

static readonly Dictionary<int, string> MyDictionary = new Dictionary<int, string> {
    { 5, "abc" },
    { 7, "ddd" }
};

声明中的readonly关键字表示无法重新分配变量(如C ++中的const指针,无法重新指定该指针以指向其他内容。这并不意味着对象不能变异。但是,ReadOnlyCollection在设计上是不可变的。

编辑:要制作const结构,请使structs不可变(没有设置方法等)。对结构来说,这是一种很好的做法。

答案 3 :(得分:1)

看看Autofixture。它可以大大简化设置单元测试。

答案 4 :(得分:1)

您可以使用NBuilder

生成测试数据

通过流畅,可扩展的界面,NBuilder允许您快速创建测试数据,自动将值分配给属于内置.NET数据类型(例如整数和字符串)类型的属性和公共字段。 NBuilder允许您使用lambda表达式覆盖您感兴趣的属性。

答案 5 :(得分:0)