如何测试字段是否为字符串

时间:2010-03-24 23:12:59

标签: c# tdd

这是我用TDD进行学习的基础知识。

我最初将Person.Surname实现为类型对象的字段(传递测试的最简单方法。

然后我添加了一个测试设置Person.Surname,说明返回值应该是一个字符串并设置为Person.Surname=20

我通过将实施更改为使用string而不是object来“修复”测试。由于静态类型检查,测试现在很长时间编译,所以我评论了它。

Person.Surname字段目前以字符串形式实现。如果我将字段的实现更改为对象,则我的测试都不会失败。

所以我没有办法在测试中留下我的意图。在这种情况下,有没有办法进行失败的测试?


更新: 我同意Esko,实际上这不是你想要做的事情。 从学习的角度来看,我试图提出的观点是,如果我(或其他人在以后的某个时间点)扩大我的字段的类型范围(比如从字符串到对象)我将不会直接单元测试失败。也许这毕竟不是一件坏事?

4 个答案:

答案 0 :(得分:5)

编写关于具有某种类型的字段的测试,抽象级别太低。写下describe features的测试。然后测试将更好地描述编写代码的原因,并且您将能够更自由地重构实现,而不会破坏/使现有测试无效。

在重构生产代码时,它会不时地影响测试代码,您需要更新测试以使它们编译并通过(测试代码需要重构与所有其他代码相同)。当发生这种情况时,测试名称告诉测试背后的意图是什么有用 - 测试指定了哪些特性/行为。然后,您可以更新测试代码,以便保持相同的意图。或者,如果编写测试的原因不再有效,那么您可以删除测试。

答案 1 :(得分:1)

Assert.IsInstanceOfType(Person.Surname, typeof(string));

答案 2 :(得分:0)

无法添加支票,如:

Assert.AreEqual( typeof(string), Person.Surname.GetType() );

答案 3 :(得分:0)

你可以使用is运算符......

if ( Person.Surname is string )
{
    // do stuff
}

你也可以用作操作员......

string surname = Person.Surname as string;
if ( surname != null ) // as succeded
{
    // do stuff
}