Testing 如何为简单的用户代理查找编写salesforce测试类?

Testing 如何为简单的用户代理查找编写salesforce测试类?,testing,salesforce,apex-code,Testing,Salesforce,Apex Code,我想为一个只返回一个值的函数编写一个测试——就是这样。我不知道你是怎么做到的。我觉得你必须使用system.assert之类的工具。SFDC新手,但已使用许多其他语言编程。下面是一些示例代码: static String getBrowserName() { String userAgent = ApexPages.currentPage().getHeaders().get('User-Agent'); if (userAgent.contains('iPhone'))

我想为一个只返回一个值的函数编写一个测试——就是这样。我不知道你是怎么做到的。我觉得你必须使用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%的测试覆盖率?

尽管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 );
}

...

尽管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 );
}

...

这不是一个直接的答案,因为Paddslacker已经谈到了这一点,但我建议您查看Apex Lang()——在许多其他方面,它有一些用于单元测试的有用类。在这里,它们本身并没有针对您的情况,但确实针对其他情况,如web服务调用的测试等。这不是一个直接的答案,因为Paddslacker已经介绍了这一点,但我建议您查看Apex Lang()——除此之外,它还有一些用于单元测试的有用类。他们在这里不涉及您的案例本身,但会涉及其他案例,如web服务调用测试等。谢谢,Paddy!在你的帮助下,我终于找到了答案不客气。我将为其他读者的答案添加更多细节,因为我意识到我实际上从未编写过测试代码本身,只是向您展示了如何重构生产代码以使其可测试。谢谢,Paddy!在你的帮助下,我终于找到了答案不客气。我将为其他读者的答案添加更多的细节,因为我意识到我从未真正编写过测试代码本身,只是向您展示了如何重构生产代码以使其可测试。