我有一个有很多属性的对象我想测试。我为每个属性编写了一个TestMethod
,但问题是许多属性在设置时会操纵其他属性。我需要的是能够设置我的测试对象,操纵其中一个变量,运行测试,将对象重置为其原始状态,然后重复该过程。这样,我可以避免这么多的冗余。
我研究过使用数据驱动方法(这是解决这个问题的完美解决方案),但Silverlight测试框架似乎没有这个方法,因为我找不到使用{{{ 1}}属性。我想过要试着看看我是否可以通过传统的MSTest框架访问DataSource
,但是唉,我只有Visual Studio Express。
我曾考虑尝试创建一个自定义测试工具,看看是否可以解决这个问题,但我想我会先询问周围的建议。
也许我应该把它搞砸,然后将所有不同的配置写成单独的DataSource
方法并注释掉我不需要的那些。
非常感谢任何帮助。
以下是要测试的对象如何工作的示例。假设您的形状具有位置坐标和每侧的坐标。更新位置坐标或其中一个边时,所有其他坐标也必须更新。
这是正在测试的功能。我想要做的是能够设置多个初始化(通过TestInitialize
或你有什么)我将设置我的对象的初始值和包含预期测试结果的模拟,然后改变其中一个有问题的财产。这样的事情(这只是为了说明,所以请忽略任何不良做法xD):
ClassInitialize
答案 0 :(得分:0)
我没有找到完全自动化的方式来实现我的原始目标,但我确实想出了一些相当容易的东西。
首先,我创建了一个单例TestManager
类来处理几乎所有的测试设置,因此我只需要在MainPage
(测试页面)类中使用一行。在TestManager
中,我添加了一个字符串变量,我也从TestSetup
添加了MainPage
类的名称。
然后,我创建了另一个名为TestClass
的{{1}},并提供了两个静态字段:
TestSetupClass
在构造函数中,我将基础类型与private static Type childType;
private static TestSetupClass childInstance;
中指定的类名进行比较,如果匹配则设置TestManager
和childType
:
childInstance
接下来,我使用Type thisType = GetType().UnderlyingSystemType;
if (thisType.Name.Equals(TestManager.Instance.SetupClassName))
{
childType = thisType;
childInstance = this;
}
属性向TestSetupClass
添加了虚拟方法。我的所有安装类都继承自AssemblyInitialize
并覆盖此方法。在该方法中,我使用TestSetupClass
获取childType
以获取子项的方法实现,并使用MethodInfo
调用它:
childInstance
瞧!如果要在运行所有测试之前运行特定设置,只需使用MethodInfo childSetup = childType.GetMethod("Setup");
childSetup.Invoke(childInstance, null);
在MainPage
中指定其类名。
我知道还有一些地方我可以做得更好,但是它有效,所以你能做什么。