2009-06-15 13 views
1

SQL Server 2000と2005の違い、特にnvarchar(max)データ型を考慮して、SQL Serverデータベースアダプターを分離しました。コードの変更が非常に小さいのでAssert.IsInstanceOfTypeを呼び出すときに祖先を除外する方法?

は、代わりに私たちのアダプタインターフェイスと抽象基本クラスを再実装するのは、私は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を作成するが、このタイプは、Sql2000Databasから継承するため、テストは合格しますeAdapter。また、それは祖先の鎖の上でさらに働きます。

私はなぜそれが渡っているのか理解しており、この特定のケースを修正するために一般的なAssert.AreEqualメソッドを使用できます。

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

しかしAssert.IsInstanceOfTypeを使用しての方法があります場合、私は興味が?

答えて

3

あなたSql2005DatabaseAdapterは、おそらくSQL 2000のサーバと連携することができませんので、それは効果的にこのようにあなたが現在している問題のようなすごみのすべての種類につながる、「Sql2005DatabaseAdapterSql2000DatabaseAdapterである」と言うことから、継承関係は、単に間違っていますあなたのテストで遭遇する。

あなたがこれを避けたい場合は、抽象基底クラスへの機能のほとんどを移動するには良いだろうとの両方が、そこから直接継承しています

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

もちろん!ダビッドありがとう、私はコーディングを始めるには速すぎると思っていて、関係を考えるのに十分な時間を費やさなかった。 – si618

2

私はあなたがすでにここに答えを知っていることを、あなたはそれを好きではない:)

Sql2005DatabaseAdapter : Sql2000DatabaseAdapterを言って疑い、あなたはSql2005DatabaseAdapterの任意のインスタンスは絶対にSql2000DatabaseAdapterされていることを言っています。だから、Assert.IsInstanceOfTypeはどういうわけか、それは...確かにうまくいっていないふりをすることを求める。

あなたは正しく正確な型をテストするための方法を与えている - あなたはこれを使用したくない理由は?

編集私はDavid Schmittと同様のことを言っていました。この継承階層は間違っています。それはそれは、Sql2005DatabaseAdapterSql2000DatabaseAdapterされていること(実世界の概念について話)言うことは本当に真実ではありませんか?

+0

だから私は再びこの問題のために該当しません:)真剣に言うと、私たちがファクトリメソッドを持っていなかったことと、私がテストで問題を見つけた特定の型に対してキャストしていたからです(私が特定の型キャストをリファクタリングしたためです)。 – si618

関連する問題