首页 > 解决方案 > 通过测试中的方法传递请求

问题描述

我的类上有一个generate()方法,它只是create类实例的简写方式。它接受request在方法上提示的类型。我正在尝试对此进行单元测试,而我知道的唯一方法是make通过answer并通过它。这不起作用,因为它不是request. 有解决办法吗?这是方法:

public static function generate(Question $question, Request $request): self
    {
        return self::create([
            'user_id' => Auth::user()->getKey(),
            'question_id' => $question->getKey(),
            'answer_body' => $request->answer_body,
        ]);
    }

这是测试

/** @test */
    public function it_can_generate_a_new_instance()
    {
        $user = factory(User::class)->create();
        $this->actingAs($user);

        $question = factory(Question::class)->create();
        $answer = factory(Answer::class)->make();

        Answer::generate($question, $answer);

        $this->assertEquals($user->getKey(), Answer::first()->user_id);
        $this->assertEquals($question->getKey(), Answer::first()->question_id);
        $this->assertEquals($answer->answer_body, Answer::first()->answer_body);
    }

测试通过,直到我Request在方法中输入提示。

标签: phplaravelhttptestingphpunit

解决方案


您可以使用给定的属性创建一个新的请求对象。它可能有点脆弱,但它应该可以工作:

public function it_can_generate_a_new_instance()
{
    $user = factory(User::class)->create();
    $this->actingAs($user);

    $question = factory(Question::class)->create();
    $answer = factory(Answer::class)->make();
    $request = new Request([ 'answer_body' => $answer->answer_body ]);

    Answer::generate($question, $request);

    $this->assertEquals($user->getKey(), Answer::first()->user_id);
    $this->assertEquals($question->getKey(), Answer::first()->question_id);
    $this->assertEquals($answer->answer_body, Answer::first()->answer_body);
}

推荐阅读