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

调用Assert.IsInstanceOfType时如何排除祖先?

  •  1
  • si618  · 技术社区  · 16 年前

    我们刚刚分离了SQL Server数据库适配器,以考虑SQL Server 2000和2005之间的差异,特别是nvarchar(max)数据类型。

    public abstract class SqlDatabaseAdapter : DatabaseAdapter, ISqlDatabaseAdapter
    ...
    public class Sql2000DatabaseAdapter : SqlDatabaseAdapter
    ...
    public class Sql2005DatabaseAdapter : Sql2000DatabaseAdapter
    ...
    

    我们的单元测试代码以前只是强制转换到特定类型的适配器,然后针对该类型进行断言,但是现在我们有了一个适配器工厂方法来构建适当的SQL Server适配器(从配置或通过SQL连接找到),我想验证是否实例化了确切的类型(由于我们现在默认使用SQL Server 2005),唯一的问题是我们的旧测试在应该失败的时候通过了:)

    在下面的示例中,实体工厂创建 Sql2005DatabaseAdapter SQL2000数据库适配器

    Entity foo = EntityFactory.Create("foo"); 
    Assert.IsInstanceOfType(typeof(SqlDatabaseAdapter), foo.Adapter); // Should fail for test
    Assert.IsInstanceOfType(typeof(Sql2000DatabaseAdapter), foo.Adapter); // Should fail for test
    Assert.IsInstanceOfType(typeof(Sql2005DatabaseAdapter), foo.Adapter); // Should pass
    

    我理解它传递的原因,我可以使用general Assert.AreEqual方法来修复这个特殊情况。

    Assert.AreEqual(typeof(Sql2005DatabaseAdapter), foo.Adapter.GetType());
    

    但我很好奇是否有办法使用Assert.IsInstanceOfType?

    2 回复  |  直到 16 年前
        1
  •  3
  •   David Schmitt    16 年前

    自从你 Sql2005DatabaseAdapter 可能无法与SQL 2000 server一起工作,继承关系是错误的,因为它实际上表示“ Sql2005DatabaseAdapter 是一个 Sql2000DatabaseAdapter

    如果您想避免这种情况,最好将大部分功能移动到抽象基类中,并使两者直接从该基类继承:

    public abstract class SqlDatabaseAdapter : DatabaseAdapter, ISqlDatabaseAdapter
    ...
    public class Sql2000DatabaseAdapter : SqlDatabaseAdapter
    ...
    public class Sql2005DatabaseAdapter : SqlDatabaseAdapter
    ...
    
        2
  •  2
  •   AakashM    16 年前

    我怀疑你已经知道答案了,你只是不喜欢:)

    Sql2005DatabaseAdapter : Sql2000DatabaseAdapter ,你是说 Sql2005DatabaseAdapter 绝对是 A. Sql2000DatabaseAdapter . 那么问这个 Assert.IsInstanceOfType 不知怎的假装它不是。。。这肯定行不通。

    编辑 我还想说一些类似于大卫·施密特的话——这种继承层次感觉是错误的。说(谈论现实世界的概念)一个 SQL2000数据库适配器 是吗?