Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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
Unit testing 将被测试类中的一个方法存根到另一个方法_Unit Testing_Mocking_Stub_Stubbing - Fatal编程技术网

Unit testing 将被测试类中的一个方法存根到另一个方法

Unit testing 将被测试类中的一个方法存根到另一个方法,unit-testing,mocking,stub,stubbing,Unit Testing,Mocking,Stub,Stubbing,我发现存根和模拟在测试中非常有用。 但我想知道一件事。我想一个例子可以清楚地说明这一点 Class A { public function isOk() { // some work } public function iAmDepend() { if ($this->isOk()) { // do work } } } class TestA { public functi

我发现存根和模拟在测试中非常有用。 但我想知道一件事。我想一个例子可以清楚地说明这一点

Class A {
    public function isOk() {
        // some work
    }

    public function iAmDepend() {
        if ($this->isOk()) {
            // do work
        }
    }
}

class TestA {
    public function testIsOk() {
        // Test itOk here
    }

    public function testIAmDepend() {
        mock(A)->method(isOk)->return(true);
        // tests for iAmDepend
    }

}
这样做明智吗?测试类的存根方法。或者它违反了一些规则


另外,我无法重构代码

您的示例是正确的,即
testIsOk
只测试
IsOk
,以及
testiamdende
只测试
iamdende

但mock和stub之间有一个重要的区别,您必须理解:


在您的示例中,如果
testiamdenden
正在验证是否已使用某些参数调用了
isOk
,并且这是unittest断言的一部分,则这是mock。否则这就是存根,您将无法验证它是否已被调用。

您的示例是正确的,即
testIsOk
仅测试
IsOk
,以及
testiamdende
仅测试
iamdende

但mock和stub之间有一个重要的区别,您必须理解:


在您的示例中,如果
testiamdenden
正在验证是否已使用某些参数调用了
isOk
,并且这是unittest断言的一部分,则这是mock。否则这就是存根,您将无法验证它是否已被调用。

单元测试术语中的依赖项通常被视为类所依赖的其他类,而不是同一类中的方法。在您的示例中,您通常会模拟类A的两个方法,并将其作为另一个类(例如classB)的模拟依赖项提供,您将使用单元测试对其进行测试。但我想知道不寻常的事情。我是否应该理解你的说法是不鼓励这种测试方法?也许这很重要,在PHP中,我可以选择要存根的方法。单元测试术语中的依赖项通常被视为类所依赖的其他类,而不是同一类中的方法。在您的示例中,您通常会模拟类A的两个方法,并将其作为另一个类(例如classB)的模拟依赖项提供,您将使用单元测试对其进行测试。但我想知道不寻常的事情。我是否应该理解你的说法是不鼓励这种测试方法?也许这很重要,在PHP中,我可以选择我想要存根的方法。我想知道是否有人会同意你的观点。例如,
RhinoMock
和其他.Net mock框架都有部分mock的概念。使用它,您可以创建CUT对象(测试中的类),为某些方法定义存根或模拟,然后在某些条件下断言CUT的行为。因此,您可以模拟使用外部资源或依赖项的工作,并仅断言错误处理。与您的示例完全相同。我认为这是有效的唯一原因是,在本例中,您正在测试两个公共方法,例如,您当前正在存根的方法是私有的,这会有一些代码味道,因为存根私有方法是一种不好的做法。我通过艰苦的方式学会了这一点。另外,我建议不要完全删除被测试的类。您应该能够对类进行单元测试,而不必对同一类的方法进行存根。好的,我在这里存根:)谢谢您的回答。我想知道是否有人会同意你的观点。例如,
RhinoMock
和其他.Net mock框架都有部分mock的概念。使用它,您可以创建CUT对象(测试中的类),为某些方法定义存根或模拟,然后在某些条件下断言CUT的行为。因此,您可以模拟使用外部资源或依赖项的工作,并仅断言错误处理。与您的示例完全相同。我认为这是有效的唯一原因是,在本例中,您正在测试两个公共方法,例如,您当前正在存根的方法是私有的,这会有一些代码味道,因为存根私有方法是一种不好的做法。我通过艰苦的方式学会了这一点。另外,我建议不要完全删除被测试的类。您应该能够对类进行单元测试,而不必对同一类的方法进行存根。