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的行为。因此,您可以模拟使用外部资源或依赖项的工作,并仅断言错误处理。与您的示例完全相同。我认为这是有效的唯一原因是,在本例中,您正在测试两个公共方法,例如,您当前正在存根的方法是私有的,这会有一些代码味道,因为存根私有方法是一种不好的做法。我通过艰苦的方式学会了这一点。另外,我建议不要完全删除被测试的类。您应该能够对类进行单元测试,而不必对同一类的方法进行存根。