我倾向于使用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#中使用这些东西?
答案 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)