Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 如何编写测试来测试具有可变返回值的函数?_Function_Variables_Testing - Fatal编程技术网

Function 如何编写测试来测试具有可变返回值的函数?

Function 如何编写测试来测试具有可变返回值的函数?,function,variables,testing,Function,Variables,Testing,我有一个简单的函数,如下所示: function CreateFileLink() { global $Username; return date("d-m-y-g-i"); } 如何编写代码来测试返回数据可变的函数?如果使用单元测试,您知道测试函数的日期、月份和年份 因此,调用函数。您有当前时间(测试运行时)。从功能时间中减去当前时间。差异应该非常小(比如2秒) 如果差值大于这个值,我就会考试不及格。(当然,这取决于系

我有一个简单的函数,如下所示:

    function CreateFileLink()
    {
            global $Username;

            return date("d-m-y-g-i");
    }

如何编写代码来测试返回数据可变的函数?

如果使用单元测试,您知道测试函数的日期、月份和年份

因此,调用函数。您有当前时间(测试运行时)。从功能时间中减去当前时间。差异应该非常小(比如2秒)


如果差值大于这个值,我就会考试不及格。(当然,这取决于系统的速度)。

看起来您可以对该函数运行的唯一测试是它不会引发异常。不需要测试返回数据,因为它是由外部实体(date()函数)生成的

您的单元测试需要做的是为该函数的正常工作设置环境,换句话说,您通过设置其他变量来模拟系统运行,然后您应该能够根据单元测试如何设置这些变量来知道它将返回什么(当然,除非返回值是一个随机数,在这种情况下,正如Randolpho所建议的,您所能做的就是确保它不会抛出)


如果您的单元测试是在设置和调用一大堆其他方法来测试此函数的情况下发现的,这可能是一个很好的迹象,表明您的函数是紧密耦合的,您可能会将其分解为更小的部分。

如果您能够以某种方式控制该日期,您可以对其进行测试()函数。例如,在本例中,您只关心使用“d-m-y-g-i”调用日期函数;您并不真正关心它的输出。可能类似于:

function CreateFileLink(DateProvider dateProvider)
{
        global $Username;

        return dateProvider.date("d-m-y-g-i");
}
抱歉,我甚至不知道这是什么语言,但希望您能理解我的观点。在生产代码中,您可以通过执行以下操作来调用它:

DateProvider standardDateProvider = new DateProvider() { Date date(String str) { return date(str); } };
CreateFileLink(standardDateProvider);
但是在您的测试中,您可以提供一个替代实现,如果输入不是您期望的,它将抛出一个错误:

DateProvider mockProvider = new DateProvider() 
{
    Date date(String str) 
    {
        if(str != "d-m-y-g-i") throw Exception();
        return "success";
    }
}
这是一个好消息

基本上,创建可测试代码的理想方法是将所有依赖项显式化,这样就不会出现两次调用同一个函数可能导致两个不同答案的情况


在日期之类的情况下,如果创建一个“系统对象”,并将其显式传递到函数中,则可以创建一个“测试系统对象”,用于测试,并返回固定值,而不是返回当前日期。

如果可以,我不知道(我还没有问问题),但如果可以的话,我会重新命名这个问题。它很模糊。可能类似于“如果返回数据是可变的,如何编写代码来测试这样的函数?”另外,我猜$Username不知何故被用在了你的函数中?如果不是,它就不属于你的函数。据我所知,Outlaw程序员的依赖注入解决方案是一个很好的解决方案。通过注入一个“已知”来消除单元测试的可变性日期生成器/文件状态/等等。你真的建议OP创建系统日期函数的模拟吗?我建议的正是“非法程序员”在回答中所描述的。