【问题标题】:How To Mock Functions Without Class in PHP (laravel)?如何在 PHP(laravel)中模拟没有类的函数?
【发布时间】:2019-12-08 14:26:35
【问题描述】:

我有一个由 composer autoload 加载的函数

    "autoload": {
        "files": [
            "app/Helpers/SmsHelper.php",
        ]
    },

这个文件有一个smsHelper函数,可以发送短信。

<?php

if (!function_exists('sendSmsHelper')) {
    function sendSmsHelper($msisdn, $message)
    {
        ..... Codes
    }
}

我的一个班级使用这个助手,我想为这个班级编写测试。 有人能告诉我如何模拟这个功能吗?因为我不想在测试模式下发送短信

【问题讨论】:

  • 只需在tests/bootstrap.php中定义函数
  • 嗨,米歇尔!让我看看你的解决方案
  • 我检查了它,米歇尔,但我得到了这个错误:致命错误:无法重新声明 smsHelper()(之前声明..作曲家加载了一次,不让我重写它!你有任何重写的解决方案吗? ?
  • 你必须在你的 composer autoload.php 被加载之前声明测试函数,因为它也会加载辅助函数然后检查function_exists
  • 我知道我必须先加载我的文件(仅在测试模式下)!但是怎么做呢?可以从代码中获得吗?或任何防止作曲家在测试模式下加载文件的解决方案!甚至让我重写一些文件

标签: php unit-testing laravel-5 mocking


【解决方案1】:

因为我没有看到任何答案,所以我决定写下我的一些研究结果: 我知道这些可能不是正确的答案,但会起作用

第一个解决方案(不好的一个):如果您在班级中使用一个函数并想为该班级编写一个测试!要模拟此类函数,您可以将测试类 NameSpace 设置为等于要为其编写测试的类,然后您可以在类中编写一个与特定函数名称完全相同的函数你的 .php 文件。

例如:您在班级中使用 date() 并希望模拟它以返回您的字符串而不是日期

<?php

//namespace Tests\Unit; change this name space to that class you want to write test for
namespace yourclass namespace;

use Mockery\Mock;

function date() {
  return "2019/12/17 01:00:00";
}

class yourNameTest extends TestCase
{
    ...... you test codes
}

您创建的函数的第二个解决方案(例如我的 smsHelper):

我在我的 smsHelper 函数中添加了一个 SwitchCase,它将检查 App 是否处于测试模式,如果它处于测试模式,我将返回 true;

    function smsHelper()
    {
        if (!App::runningUnitTests()) {
            ....... my codes
        } else {
            return true;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-23
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 2019-11-01
    相关资源
    最近更新 更多