我们刚刚分离了 SQL Server 数据库适配器以允许 SQL Server 2000 和 2005 之间的差异,特别是 nvarchar(max) 数据类型。
因为代码更改很小,我没有重新实现我们的适配器接口(interface)和抽象基类,而是从 SQL 2000 中继承了 SQL 2005 适配器,并只覆盖了适当的方法和属性。
public abstract class SqlDatabaseAdapter : DatabaseAdapter, ISqlDatabaseAdapter
...
public class Sql2000DatabaseAdapter : SqlDatabaseAdapter
...
public class Sql2005DatabaseAdapter : Sql2000DatabaseAdapter
...
我们的单元测试代码以前只是转换为特定类型的适配器,然后针对该类型做出断言,但现在我们有一个适配器工厂方法来构建适当的 SQL Server 适配器(从配置或通过 SQL 连接找到) ,我想验证是否实例化了确切的类型(因为我们现在默认使用 SQL Server 2005),唯一的问题是我们的旧测试在它们应该失败的时候通过了:)
在下面的例子中,实体工厂创建了一个Sql2005DatabaseAdapter,但是测试通过了,因为这个类型继承自Sql2000DatabaseAdapter。它还在祖先链的更上游发挥作用。
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
我明白它为什么会通过,我可以使用通用的 Assert.AreEqual 方法来解决这个特殊情况。
Assert.AreEqual(typeof(Sql2005DatabaseAdapter), foo.Adapter.GetType());
但我很好奇是否有使用 Assert.IsInstanceOfType 的方法?
最佳答案
由于您的 Sql2005DatabaseAdapter
可能无法与 SQL 2000 服务器一起工作,因此继承关系是错误的,因为它实际上表示“Sql2005DatabaseAdapter
是一个 Sql2000DatabaseAdapter
", 从而导致各种怪异,就像你目前在测试中遇到的问题。
如果你想避免这种情况,最好将大部分功能移动到一个抽象基类中并直接从它继承:
public abstract class SqlDatabaseAdapter : DatabaseAdapter, ISqlDatabaseAdapter
...
public class Sql2000DatabaseAdapter : SqlDatabaseAdapter
...
public class Sql2005DatabaseAdapter : SqlDatabaseAdapter
...
关于c# - 调用 Assert.IsInstanceOfType 时如何排除祖先?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/994871/