【问题标题】:Laravel 8 Unit TestLaravel 8 单元测试
【发布时间】:2021-11-16 21:50:06
【问题描述】:

我是单元测试的新手。该应用程序具有helpersApp\Helpers\Helper'Helper' => App\Helpers\Helper::class 已添加到 config 中的别名中)。

对于测试,有必要使用助手的功能,因为授权通过另一个服务,我从助手那里发送所有请求。

测试代码本身:

class ParticipantsTest extends TestCase
{
    use RefreshDatabase;

    public function test_createParticipants()
    {
        $participant = Helper::getRandParticipant();
        $type_participant = Helper::getType(2);
        $token = Helper::chooseToken($type_participant);

        $response = $this->post('/api/participants/create', [
            'token' => Helper::renewToken($participant, $token),
            'type_participant' => $type_participant,
            'callback' => $this->faker->sentence(20),
        ]);

        $response->assertStatus(200);

        $this->assertTrue(count(Task::all()) > 1);
    }
}

通过测试时出现错误:

尝试读取null上的属性“参与者”

虽然当我使用getRandParticipnat 方法向API 发送测试请求时,我得到了一个随机参与者,并且在测试中是null,我该如何解决它?

谢谢

UPD:

<php>
    <server name="APP_ENV" value="testing"/>
    <server name="BCRYPT_ROUNDS" value="4"/>
    <server name="CACHE_DRIVER" value="array"/>
    <server name="DB_CONNECTION" value="sqlite"/> 
    <server name="DB_DATABASE" value=":memory:"/> 
    <server name="MAIL_MAILER" value="array"/>
    <server name="QUEUE_CONNECTION" value="sync"/>
    <server name="SESSION_DRIVER" value="array"/>
    <server name="TELESCOPE_ENABLED" value="false"/>
</php>

我想我需要重新配置 mysql 连接?如果我这样做,可以用我的真实数据测试 clear DB 吗?

【问题讨论】:

  • 如果您从Helper::getRandParticipant() 得到null 并且您不知道为什么,请分享该代码......我们不是知道为什么的魔术师。另外,将您的 IDE 更改为不执行 ClassName :: method$ this-&gt; method1-&gt; method2 ($ parameter),这不遵循 PSR 并且真的很难阅读...
  • ClassName :: method or $ this-&gt; method1-&gt; method2 ($ parameter) 做一个stackoverflow
  • public static function getRandParticipnat(){ $participant = Participant::inRandomOrder()-&gt;first('participant'); return $participant-&gt;participant; } 如果我在 api 上使用此功能,它可以工作,但在单元测试中不起作用
  • 那么,您的数据库中是否有任何数据,所以Participant::inRandomOrder() 将返回一个模型?你100%确定你有数据吗?看来你没有。另外,我没有看到您使用factory 伪造Participant's 数据。
  • @matiaslauriti,我当然有数据。在问题中,我是这么说的。当我使用邮递员从 api 中获取数据时,从 getRandParticipnat() 函数中,我得到了它,但是在单元测试中我有错误

标签: php laravel unit-testing phpunit


【解决方案1】:

@matiaslaurit 我将 MySQL 用于 API,将 phpunit.xml 用于单元测试/ 我的 phpunit.xml:

<php>
    <server name="APP_ENV" value="testing"/>
    <server name="BCRYPT_ROUNDS" value="4"/>
    <server name="CACHE_DRIVER" value="array"/>
    <server name="DB_CONNECTION" value="sqlite"/> 
    <server name="DB_DATABASE" value=":memory:"/> 
    <server name="MAIL_MAILER" value="array"/>
    <server name="QUEUE_CONNECTION" value="sync"/>
    <server name="SESSION_DRIVER" value="array"/>
    <server name="TELESCOPE_ENABLED" value="false"/>
</php>

我想我需要重新配置 mysql 连接?如果我这样做,可以用我的真实数据测试 clear DB 吗?

【讨论】:

  • 我建议您编辑您的问题,特别是添加这种代码和平和所有其他要求“matiaslaurit”的精度。然后,添加评论以告知您编辑了您的问题。但是,如果它不能解决您的问题,请不要自行回答;)
  • 感谢您的建议
猜你喜欢
  • 2021-02-17
  • 2021-05-12
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 2020-09-03
  • 2017-10-26
相关资源
最近更新 更多