代码之家  ›  专栏  ›  技术社区  ›  AndyM

如何测试字段是字符串

  •  0
  • AndyM  · 技术社区  · 14 年前

    这就是我为了学习的目的回到TDD的基础知识。

    我最初执行 Person.Surname 作为类型对象的字段(通过测试的最简单方法)。

    然后我添加了一个测试设置 姓氏 声明返回值应为字符串并设置 Person.Surname=20 .

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

    姓氏 字段当前实现为字符串。如果我将字段的实现更改为对象,那么我的测试都不会失败。

    所以我没有办法在考试中离开我的意图。在这种情况下有没有一种失败的测试方法?


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

    4 回复  |  直到 7 年前
        1
  •  5
  •   Esko Luontola    14 年前

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

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

        2
  •  1
  •   John Buchanan    14 年前
    Assert.IsInstanceOfType(Person.Surname, typeof(string));
    
        3
  •  0
  •   Thomas    14 年前

    你不能加一张支票吗?

    Assert.AreEqual( typeof(string), Person.Surname.GetType() );
    
        4
  •  0
  •   Muad'Dib    14 年前

    您可以使用IS操作员….

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

    也可以用作运算符…

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