gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:45:37 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com