2010-03-24 4 views
6

Я только что закончил книгу Майкла Перса Working Effectively with Legacy Code. Это была отличная книга о том, как эффективно создавать тестовые швы и использовать их для проверки существующего кода.Ссылка швов в .NET

Один из техник, о которых он говорил, использовал «швы ссылок». В основном идея заключалась в том, что если бы у вас был код, который в зависимости от другой библиотеки, вы могли бы использовать компоновщик для вставки другой библиотеки для тестирования, чем для производства. Это позволит вам ощущать условия тестирования через макетную библиотеку или не звонить в библиотеки, которые имеют реальные эффекты (базы данных, электронные письма и т. Д.) И т. Д.

Пример, который он дал, был на C++. Мне любопытно, может ли эта техника (или что-то подобное) в .NET/C#?

+1

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

+0

О, я абсолютно согласен. И TBH я не уверен, что буду использовать его когда-либо. Мне больше всего любопытно, даже если это возможно в стеке .NET. – RationalGeek

ответ

4

Да, это возможно в .Net. В простейшем случае, вам может просто заменить сборку на другое одноименное имя.

С сильно именованной сборкой вы должны изменить номер версии, а затем настроить привязки сборок, чтобы переопределить версию «связанного» времени компиляции. Это можно сделать на предприятия, машины, пользователя или справочника.

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

Другими словами, если вы, разработчик приложения, не хотите, чтобы ваши библиотеки «издевались» (или, возможно, заменялись вредоносным кодом), вы должны убедиться, что сборка подписана, а закрытый ключ не является общедоступным.

Вот почему вы не можете моргнуть DateTime - поскольку Microsoft решительно назвала основные библиотеки .Net.

2

Это звучит немного похоже на вещи Typemock isolator предлагает, в частности, их заявленную способность вырвать и mock existing types. Но я никогда не использовал его ;-(

В качестве примера, DateTime.Now является то, что не должно быть mockable, верно? alt text http://site.typemock.com/storage/feature-images/dateTime.png?__SQUARESPACE_CACHEVERSION=1252774490561

Смежные вопросы