2011-05-06 91 views
2

这样的状态的方法的单元测试,我有以下的(使用C#)的问题:关于改变私人领域

我有两个私人领域中的一类,一个是节省了场的原始状态还有一个保存更新的状态。

我现在想编写一个基本上采用原始状态的方法,将其复制到更新的状态并更改它的一些内容。

到目前为止,我已经实现,作为一个无效的方法,只是改变字段的状态(如果需要)。这些字段稍后将被另一种方法使用。

我不认为我会有任何实施的麻烦,但我想为这种方法编写单元测试(与MSTest),并不能看到我可以如何正确地测试这个。

我真的需要测试的是给定输入参数的字段内容与原始状态相比是否发生了变化。由于这两个字段都是私有的,我不能访问原始状态来为单元测试设置一个值,也不能访问这些字段以用于任何断言的比较。

最简单的方法是公开所有这些领域与公共属性,但我真的没有用于公共属性除了单元测试。另一种方法是重写方法以返回更新后的状态,但这仍然不能帮助我将原始状态设置为测试所需的状态。

关于如何解决这个问题的任何想法或最佳实践?

回答

3

使用PrivateObject.GetField()检索该字段的最终状态。 (privateObject members

这比修改API只是为了使其可测试性更好。

+0

我认为这是我正在寻找的。我实际上改变了原来的状态并返回更新后的状态,这使得它可以自行测试。我不确定是否对该解决方案感到满意,所以我可能会返回到前一个迭代,并更新测试以使用PrivateObject。无论如何,这是非常好的知道未来的测试。 – 2011-05-16 09:06:21

2

什么可见如果字段被正确复制,会发生变化吗?推测它会影响某些方式中对象的行为......所以这是测试的理想之选。

为了可测试性,有时可能需要添加内部帮助器方法(与InternalsVisibleTo一起使用),但理想情况下,测试对可见行为/状态的更改是不太脆弱的方法。

+0

直到很久以后,当另一个方法使用这些字段写出一个xml文件时,可见的变化才显而易见。基本上有方法来读取原始的XML,对特定的节点进行更改,并写出更新的XML。我设法构建它,以便我可以自己测试所有的方法,但是这个方法在两者之间,并且在当前状态下需要检索原始状态的方法和写出更改以进行更改的方法可见。 – 2011-05-06 09:00:56