我正在寻找一个只返回一个值的函数的测试 - 就是这样。我不确定你怎么能这样做。我的印象是你必须使用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%的测试覆盖率?
答案 0 :(得分:4)
虽然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 );
}
...