php - 单元测试是否意味着测试必须被模拟?

标签 php unit-testing phpunit integration-testing

单元测试是否意味着测试必须被模拟,或者单元测试的定义可以不被模拟?

例如下面的例子,这个测试是模拟的,所以它是单元测试:

/**
* @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/

相关文章:

php - 在 PHP/C++ 中加密自定义数据包

php - 如何找到多维数组中每个元素的所有唯一组合

php - Laravel 5 : when persist form data, _token导致批量分配异常

angular - karma : How to debug a RangeError: Maximum call stack size exceeded?

php - 如何在PHPUnit中获取表单对象

PHP:检查电子邮件是否包含 "@"和 "."

unit-testing - 单元测试期间 Ada 中的异常处理

python - 如何使用 pytest 断言不引发警告

symfony - XPath:使用相对路径获取值(PHP、Symfony、DOMCrawler)错误

php - 如何为 PHPunit 测试设置特定的类属性?