- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用反射来用测试数据填充给定的 C# 类
public object CreateObj(Type type)
{
var obj = Activator.CreateInstance(type);
var fields = type.GetFields();
foreach (var field in fields)
{
field.SetValue(obj, GetRnd(field.FieldType));
}
return obj;
}
GetRnd()
函数根据字段类型设置值:
private object GetRnd(Type type)
{
if (type == typeof(int))
{
return 4;
}
else if (type == typeof(string))
{
return "text";
}
else
{
throw new Exception();
}
}
只要我向 CreateObj()
传递一个适当的类,它就可以工作。我想让它与基本类型(字符串、整数等)一起工作。到目前为止,当我传递一个简单的“int”时,我得到一个“SetType(): Cannot set a constant field”异常。
最佳答案
First of all: for a unit test it is not advised to create test objects with random values.
单元测试的目的是找出正在测试的类中的错误。当前版本和 future 版本中的错误。您的单元类不是为了查找使用正常输入时发生的错误而创建的。在代码更改后第一次运行程序时已经发现了这些错误。主要目的是找出正常运行程序时找不到的错误。
Your unit test would only give confidence in your code if it will find errors in rare cases.
通常它们被称为边缘条件:最低值、最高值、空值、最大值数、负值、空值等。
创建一个充满随机值的类需要花费大量精力来创建创建测试对象的代码,该测试对象可能会发现与您可以在一分钟内发明的任何非边缘测试对象相同的错误。在使用空数组、负数元素或偶数主数等测试代码之前,您必须运行测试一百万次。
Therefore don't put any effort in creating a unit test with random value input.
只有少数正常输入的情况,并尝试找到大量具有边缘条件的测试。
但是,创建一个工厂来创建填充随机值的任何类型的任何类可能是一个有趣的练习。
首先你应该只初始化可写的属性,因此你应该检查它们是否是。使用 System.PropertyInfo.IsWritable。
此外,扩展您的 GetRnd 函数,以便它将初始化任何原始类型使用 System.Type.IsPrimitive 和 System.Type.GetTypeCode()
如果您的可写属性之一是一个类,您的类将失败。在那种情况下,您可以递归地初始化该类。使用 System.Type.IsClass
您是否也想使用非默认构造函数初始化类?使用 System.Type.GetConstructors 查看它是否有并检查还有哪些其他构造函数可用。
数组怎么样?
额外的困难:如果你的类有一个只读属性,你可以在其中更改返回值。
class RandomObjectFactory
{
// creates an object of type T that has a default constructor
public T CreateObject<T>() where T: class, new()
{
...
此方法优于带有 Type 参数的方法,因为如果您尝试编写此方法,编译器会报错:
MyClass m = CreateObject<YourClass>();
此外,如果 MyClass 没有默认构造函数,编译器会报错。
同样,为基本类型创建一个方法是明智的:
public T CreatePrimitive<T> where T: struct, IConvertible
{
...
这可以防止以下错误:
int i = Create(typeof(Form));
创建对象的代码:
public T CreateObject<T>() where T: class, new()
{
var obj = Activator.CreateInstance<T>();
foreach (var property in typeof(T).GetProperties()
.Where(property => property.CanWrite))
{
if (property.PropertyType.IsPrimitive)
{
property.SetValue(obj, this.CreatePrimitive
(Type.GetTypeCode(property.PropertyType)));
}
else if (property.PropertyType.IsClass)
{
property.SetValue(obj, this.CreatObject...
这里我们遇到了问题:我们无法传递 property.PropertyType。
要解决这个问题:创建一个私有(private)函数 CreateObject,它接受一个 system.Type 并返回一个对象。因为这是私有(private)的,所以任何人都不能错误地使用它。
private object CreateObject(Type type)
{
var obj = Activator.CreateInstance(type);
foreach (var property in typeof(T).GetProperties()
.Where(property => property.CanWrite))
{
if (property.PropertyType.IsPrimitive)
{
property.SetValue(obj, this.CreatePrimitive
(Type.GetTypeCode(property.PropertyType)));
}
else if (property.PropertyType.IsClass)
{
property.SetValue(obj, this.CreateObject (property.PropertyType);
}
}
return obj;
}
private object CreatePrimitive(TypeCode typeCode)
{
switch (typeCode)
{
case TypeCode:Boolean:
return this.rnd.Next(2) == 0;
case TypeCode.Byte:
return (Byte)this.rnd.Next(Byte.MinValue, Byte.MaxValue);
case TypeCode.DateTime:
long ticks = (long)((DateTime.MaxValue.Ticks - DateTime.MinValue.Ticks) * rnd.NextDouble() + DateTime.MinValue.Ticks);
return new DateTime(ticks);
// etc.
}
return obj;
}
发明类似于创建结构或数组的东西。
关于c# - 用测试数据填充一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31810655/
过去 7-8 个月以来,我们一直在使用 Firebase。 这是一个非常棒的工具,感谢您的努力。 这里我有一个问题,是否有一种方法可以在不实际写入数据库的情况下修改数据。 因为大多数情况下,当我们调试
我正在尝试创建一个 W2V 模型,然后生成用于我的模型的训练和测试数据。我的问题是,在使用训练数据创建 W2V 模型后,如何生成测试数据。 最佳答案 Word2Vec 被认为是一种“无监督”算法,因此
from scipy.cluster.hierarchy import dendrogram, linkage,fcluster import numpy as np import matplotli
我有一个组件,我想在单元测试中检查选择器 @Component({ selector: 'my-component', )} 我想这样测试 describe('My Component',
想知道哪个好。 我必须将一些 JUnit 测试数据保存在不同的文件中。让我们将其称为 TestingData.java。我想到了两种方法。 第一种方式 TestingData.java public
这个问题在这里已经有了答案: 关闭 14 年前。 我想对我的一些 SQL 查询进行压力测试,找出糟糕的查询计划和瓶颈。我计划用随机测试数据填充一些表。 是否有工具或一组脚本可用于此目的,最好是用于
我正在尝试预测以下内容: list( [ 收盘价(当日) - 开盘价(当日) ] ) 使用以下内容作为输入: list( [ 开盘价(当天) - 收盘价(昨天) ] ) 但是,我的 test_pred
我已经编写了一个函数库,可以根据 ISO/IEC 7813 从卡片(信用卡、ID 等)上的磁条解析轨道 1 和轨道 2 数据。我希望针对一些有效的(但显然不是)严格测试这个库真正的信用卡')跟踪 2
我的问题如下。我有 6 个数据集(从不同的日子收集),我想为其构建决策树分类器。我需要找到最佳的树深度参数以避免过度拟合并对新数据进行良好的预测。 我的第一次尝试是将每个数据集按 50%/25%/25
我想在我的仪器测试中使用大文件(> 2 GB 的 zip 存档和视频文件)来测试从 SD 卡/内部存储加载文件。 如何编写这些仪器测试并为它们配备所需的文件?对于其他测试,我只需要非常小的文件,所以我
我在理解 MXNet ImageRecordIter 的工作原理时遇到了一些困难。 Here是我一直在使用的引用 首先,--test-ratio 标志实际上是做什么的?生成lst文件时,我无法分辨哪些
考虑具有成本函数的线性回归模型: 这里有 = 模型的权重 我们添加正则化参数以避免过度拟合数据。正则化项通过根据模型的权重对模型进行惩罚来阻止使用大的权重,转而使用较小的权重。问题是: 为什么保持模型
我们正在为基于 REST 的后端构建 Grails 前端。我们有很多值 (DTO) 编码到 JSON 或从 JSON 编码。 我正在寻找一种方便的方法来构建这些 DTO 的模拟以用于测试目的。我喜欢
我在家里的电脑和笔记本电脑上都在做一个 Python/MongoDB 项目。自然地,文档存储中的模式最好由数据本身表示 - 这就是为什么我想通过 Mercurial 分发我的测试数据以及代码本身。 最
Spring Test 有助于回滚测试方法中对数据库所做的任何更改。这意味着不必在每个测试方法之前花时间删除/重新加载测试数据。 但是,如果您使用 @BeforeClass Junit 注释,则会强制
我试图理解这行代码: msk = np.random.rand(len(df)) 小于 ( 大于或等于 (>=) 0.8。 ~msk 将 True 翻转为 False 并将 False 翻转为 Tr
我已按照说明使用 JMonkey 创建 Gradle 项目,但无法按照教程中所述加载任何 Assets : http://wiki.jmonkeyengine.org/doku.php/jme3:be
我试图理解这行代码: msk = np.random.rand(len(df)) 小于 ( 大于或等于 (>=) 0.8。 ~msk 将 True 翻转为 False 并将 False 翻转为 Tr
我正在尝试使用此处介绍的 Excel 数据阅读器 http://fabiouechi.blogspot.fi/2010/07/excel-data-driven-tests-with-nunit.ht
我想知道是否可以在根 html 元素级别向第 3 方包添加唯一标识符。例如,我通过 NPM 使用包 myDatePicker。 我可以将 ID 标记添加到实际的 html 元素,但嵌套在该元素内部的是
我是一名优秀的程序员,十分优秀!