Как исключить предков при вызове Assert.IsInstanceOfType? - PullRequest
1 голос
/ 15 июня 2009

Мы только что разделили наши адаптеры базы данных SQL Server, чтобы учесть различия между SQL Server 2000 и 2005, в частности, тип данных nvarchar (max).

Поскольку изменение кода настолько мало, что вместо переопределения наших интерфейсов адаптера и абстрактного базового класса, я переклассифицировал адаптер SQL 2005 из SQL 2000 и просто переопределил соответствующие методы и свойства.

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?

Ответы [ 2 ]

3 голосов
/ 15 июня 2009

Поскольку ваш Sql2005DatabaseAdapter, по-видимому, не может работать с сервером SQL 2000, отношения наследования просто неверны, поскольку он фактически говорит: "Sql2005DatabaseAdapter - это Sql2000DatabaseAdapter", что приводит ко всем видам странности, как проблема, с которой вы сейчас сталкиваетесь в своем тесте.

Если вы хотите избежать этого, было бы хорошо перенести большую часть функциональных возможностей в абстрактный базовый класс, и оба они наследуются напрямую от этого:

public abstract class SqlDatabaseAdapter : DatabaseAdapter, ISqlDatabaseAdapter
...
public class Sql2000DatabaseAdapter : SqlDatabaseAdapter
...
public class Sql2005DatabaseAdapter : SqlDatabaseAdapter
...
2 голосов
/ 15 июня 2009

Я подозреваю, что вы уже знаете ответ здесь, вам просто не нравится:)

Говоря Sql2005DatabaseAdapter : Sql2000DatabaseAdapter, вы говорите, что любой экземпляр Sql2005DatabaseAdapter абсолютно ЕСТЬ a Sql2000DatabaseAdapter. Итак, спросив, что Assert.IsInstanceOfType каким-то образом делает вид, что это не ... конечно, не сработает.

Вы правильно дали способ проверить точный тип - почему вы не хотите использовать это?

edit Я также хотел сказать что-то похожее на то, что есть у Дэвида Шмитта - эта иерархия наследования кажется неправильной. Неверно говорить (говоря о концепциях реального мира), что Sql2005DatabaseAdapter IS a Sql2000DatabaseAdapter, не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...