单元测试是否意味着测试必须被模拟,或者单元测试的定义可以不被模拟?
例如下面的例子,这个测试是模拟的,所以它是单元测试:
/**
* @test
*/
public function it_should_return_true_if_ssh_client_is_connected()
{
$this->phpSecLibShh->shouldReceive('isConnected')->andReturn(true)->once();
$this->assertTrue($this->shell->connected($this->phpSecLibShh));
}
下面的例子,这是单元测试还是集成测试?这个我不太清楚:
/**
* @test
*/
public function it_should_get_half_price_discount()
{
$cost = 50;
$order = new Order();
// It does not connect to database or any other service
$discounted = $order->discount(Order::DISCOUNT_HALF_PRICE, $cost);
$this->assertEquals(25, $discounted);
}
最佳答案
模拟的主要思想是解耦依赖。单元测试不应该有任何类型的依赖性。假设您的业务逻辑连接到数据库层,数据库层又连接到数据库。现在您正在编写单元测试来测试您的业务逻辑。如果您没有将数据库基础层与业务逻辑解耦,那么您的单元测试将访问数据库,这是永远不应该发生的。因此,您应该做的是将数据库依赖项注入(inject)业务逻辑层,并在编写单元测试时模拟该依赖项。
长话短说,单元测试并不总是需要模拟,但如果有任何依赖关系,那么应该模拟它。如果您的测试有任何依赖项(例如数据库依赖项、文件依赖项等),那么您的测试不是单元测试而是集成测试
关于php - 单元测试是否意味着测试必须被模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46455397/