Как вы могли бы написать тестовый класс Salesforce для простого поиска агента пользователя? - PullRequest
1 голос
/ 28 июля 2011

Я хочу написать тест для функции, которая просто возвращает значение - вот и все. Я не уверен, как ты мог это сделать. У меня сложилось впечатление, что вы должны использовать system.assert или что-то. Новичок в SFDC, но программируется на многих других языках. Вот пример кода:

static String getBrowserName()
{
String userAgent = ApexPages.currentPage().getHeaders().get('User-Agent');
    if (userAgent.contains('iPhone'))
        return 'iPhone-Safari';
    if (userAgent.contains('Salesforce'))
        return 'Salesforce';
    if (userAgent.contains('BlackBerry'))
        return 'BlackBerry';
    if (userAgent.contains('Firefox'))
        return 'Firefox';
    if (userAgent.contains('Safari'))
        return 'Safari';
    if (userAgent.contains('internet explorer'))
        return 'ie';
    return 'other';
}

Как вы можете получить 100% тестовое покрытие для этого?

1 Ответ

4 голосов
/ 28 июля 2011

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

static String getBrowserName(string userAgentStringToTest)
{
    PageReference pageRef = getPageReference(userAgentStringToTest);
    String userAgent = getUserAgent(pageRef);
    ...
}

PageReference getPageReference(string userAgentStringToTest)
{
    if(userAgentStringToTest.Length == 0)
    {
         return ApexPages.currentPage();
    }
    else
    {
         PageReference pageRef = new PageReference('someURL');
         pageRef.getHeaders().put('User-Agent', userAgentStringToTest);
         return pageRef;
    }
}

String getUserAgent(PageReference pageRef)
{
    pageRef.getHeaders().get('User-Agent');
}

Затем вы бы вызвали метод getBrowserName спустая строка в вашем рабочем коде и строка, которую вы хотите протестировать в своем тестовом коде.

Конечно, есть несколько различных вариантов - вы можете перегружать методы и иметь метод без параметров для основного кодаи параметризованный метод для тестирования.Это не идеально, но я не знаю другого способа сделать это на платформе force.com.

РЕДАКТИРОВАТЬ: Просто для полноты я добавляю примеры тестов, чтобы уточнитьвещи.Мой пример показал, как реорганизовать производственный код, чтобы сделать его тестируемым, но не привел пример того, как написать тест, как запрашивал OP.

Ваши тесты будут выглядеть примерно так:

static testMethod void checkIPhoneBrowser() 
{
    String actualBrowserName = getBrowserName('string containing iPhone somewhere');
    String expectedBrowserName = 'iPhone-Safari';
    System.assertEquals(expectedBrowserName , actualBrowserName );
}

static testMethod void checkIEBrowser() 
{
    String actualBrowserName = getBrowserName('string containing internet explorer somewhere');
    String expectedBrowserName = 'ie';
    System.assertEquals(expectedBrowserName , actualBrowserName );
}

...
...