【发布时间】:2009-06-15 07:30:26
【问题描述】:
我们刚刚分离了 SQL Server 数据库适配器以允许 SQL Server 2000 和 2005 之间的差异,特别是 nvarchar(max) 数据类型。
由于代码更改非常小,我没有重新实现我们的适配器接口和抽象基类,而是从 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 的方法?
【问题讨论】:
标签: c# .net unit-testing nunit