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

标签 c# .net unit-testing nunit

我们刚刚分离了 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/

相关文章:

c# - Silverlight - 使用 JAVA 在运行时发送/接收数据

.net - 私有(private) nuget 源 github 返回 401 并提供正确的凭据

c# - .NET FW BitmapImage 类何时下载/缓存?

javascript - 如果在 angularJS 的配置中配置,则测试 stateProvider 状态在 $state 上返回 null

unit-testing - MonoTouch 和 NUnitLite : what is the "Host" setting for?

c# - NHunspell 拼写检查器中的错误

c# - 使用 DirectoryEntry 对象调用 ChangePassword

c# - 使用报告查看器自动打印报告

.net - 在 WPF 中拉伸(stretch)控件以填充 ListView 列

javascript - 如何在 chai 测试框架中测试数组?