php - 用先知 mock 一个方法

标签 php unit-testing phpunit

假设有一个方法

public function updateTimestamp($sessionId, $data)
{
    return $this->memcached->touch($sessionId, time() + $this->ttl);
}

我想测试。 Infection更改 + time() + $this->ttl - 而且我所有的测试都还在通过。所以我想做一个测试来模拟 Memcached 对它的影响,并有条件地返回 true/false基于传递给它的第二个参数。

所以做这样的事情:
    // $ttl is set;
    $memcachedMock
        ->touch(
            'sessionId',
            $certainValuePassedToTouch
        )
        ->willReturn(
            $certainValuePassedToTouch >= time() + $ttl 
                ? true 
                : false
        )
        ;

现在有两个问题:
  • 我不知道如何为传递给被模拟的方法的任意整数参数设置这样的条件
  • 基于 time() 似乎非常不可靠,那么如果 time() 用于方法本身,我如何可靠地测试它?
  • 最佳答案

    也许你可以看看这个工具:

  • https://github.com/php-mock/php-mock
  • https://github.com/php-mock/php-mock-phpunit

  • 基于 PHP 的命名空间回退策略 ( https://www.php.net/manual/en/language.namespaces.fallback.php ),它允许模拟 php 原生函数,如 time()、date() 等。

    关于php - 用先知 mock 一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61976480/

    相关文章:

    php - 从函数返回并回显我的数组

    unit-testing - 测试和模拟一个不返回任何值的函数

    c# - 如何在 .NET Core 中使用 xUnit 测试 Xamarin ViewModel?

    php - 如何让我的 PHPUnit 测试更简洁、更短?

    Symfony2 phpunit 给出 503 错误

    php - 表单不会向数据库提交信息

    php - 记录所有执行的行

    php - .htaccess SEO 动态网址不起作用

    java - 正确配置以模拟 Hibernate 的 sessionFactory.getCurrentSession()

    laravel - 如何从 PHPUnit 测试设置运行 Laravel Database Seeder?