Мы только что разделили наши адаптеры базы данных 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?