Интеграционный тест для всех ссылок вызова метода - PullRequest
2 голосов
/ 29 марта 2011

Итак, я немного искал в интернете, пытаясь выяснить, изобрел ли кто-нибудь колесо здесь.Я хочу написать интеграционный тест, который проанализирует текущий проект, найдет все ссылки на определенный метод, найдет его аргументы, а затем проверит базу данных на наличие этого аргумента.Например:

public interface IContentProvider
{
     ContentItem GetContentFor(string descriptor);
}

public class ContentProvider : IContentProvider
{
    public virtual ContentItem GetContentFor(string descriptor)
    {
        // Fetches Content from Database for descriptor and returns in
    }
}

Любой другой класс получит IContentProvider, внедренный в их конструктор с помощью IOC, так что они могли бы написать что-то вроде:

contentProvider.GetContentFor("SomeDescriptor");
contentProvider.GetContentFor("SomeOtherDescriptor");

По сути, модульный тест находит всеэти ссылки, найти набор текста ["SomeDescriptor", "SomeOtherDescriptor"], а затем я могу проверить базу данных, чтобы убедиться, что у меня есть строки, определенные для этих дескрипторов.Кроме того, дескрипторы жестко закодированы.

Я мог бы сделать значение enum для всех дескрипторов, но enum имел бы тысячи возможных опций, и это похоже на хак.

Теперь эта ссылка на SO: Как я могу получить всю ссылку с помощью Reflection + C # , в основном говорит, что это невозможно без какого-либо очень продвинутого анализа IL.Уточнить;Мне не нужен Reflector или что-то в этом роде - это просто автоматический тест, который я могу запустить, чтобы, если другие разработчики из моей команды проверят код, который вызывает этот контент, не создавая запись в БД, тест не пройден.

Возможно ли это?Если да, есть ли у кого-нибудь ресурс для просмотра или пример кода для изменения?

РЕДАКТИРОВАТЬ: В качестве альтернативы, возможно, другой метод выполнения этой VS пытается найти все ссылки?Конечный результат - я хочу, чтобы тест не прошел, если запись не существует.

1 Ответ

1 голос
/ 29 марта 2011

Это будет очень сложно: ваша программа может вычислить значение дескриптора, что будет означать, что ваш тест сможет узнать, какое значение возможно без выполнения указанного кода.

Я бы предложил изменить способ программирования здесь, используя тип перечисления или кодирование с использованием шаблона безопасного перечисления типа . Таким образом, каждое использование GetContentFor будет безопасным: аргумент является частью перечисления, а средство проверки типов языков выполняет проверку.

Затем ваш тест может легко выполнить итерации по различным полям перечисления и проверить, что они все объявлены в вашей базе данных, очень легко.

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

...