这是我用TDD进行学习的基础知识。
我最初将Person.Surname
实现为类型对象的字段(传递测试的最简单方法。
然后我添加了一个测试设置Person.Surname
,说明返回值应该是一个字符串并设置为Person.Surname=20
。
我通过将实施更改为使用string
而不是object
来“修复”测试。由于静态类型检查,测试现在很长时间编译,所以我评论了它。
Person.Surname
字段目前以字符串形式实现。如果我将字段的实现更改为对象,则我的测试都不会失败。
所以我没有办法在测试中留下我的意图。在这种情况下,有没有办法进行失败的测试?
更新: 我同意Esko,实际上这不是你想要做的事情。 从学习的角度来看,我试图提出的观点是,如果我(或其他人在以后的某个时间点)扩大我的字段的类型范围(比如从字符串到对象)我将不会直接单元测试失败。也许这毕竟不是一件坏事?
答案 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
}