laravel 如何使用Str::shouldReceive?(模拟Illuminate\Support\Str)

alen0pnh  于 2023-08-08  发布在  其他
关注(0)|答案(4)|浏览(111)

我有一个使用Str::random()的类,我想测试一下。
但是当我在测试中使用Str::shouldReceive('random')时,我得到一个BadMethodCallException,说shouldReceive方法不存在。
我还尝试直接模拟类并将其绑定到IOC,但它会继续执行原始类,生成一个随机字符串,而不是我在模拟上设置的返回值。

$stringHelper = Mockery::mock('Illuminate\Support\Str');
    $this->app->instance('Illuminate\Support\Str', $stringHelper);
    //$this->app->instance('Str', $stringHelper);

    $stringHelper->shouldReceive('random')->once()->andReturn('some password');
    //Str::shouldReceive('random')->once()->andReturn('some password');

字符串

1qczuiv0

1qczuiv01#

只要您还使用IoC来解析该类的绑定,您所尝试的方法就可以工作。

$instance = resolve(\Illuminate\Support\Str::class);
$instance::random();

字符串

a6b3iqyw

a6b3iqyw2#

你不能使用laravel Mock,因为Str::random()不是Facade。相反,您可以创建一个新类,其中包含一个设置测试环境方法。就像这样:‍‍‍

<?php

namespace App;


use Illuminate\Support\Str;

class Token
{
    static $testToken =null;
    public static function generate(){
        return static::$testToken ?:Str::random(60);
    }

    public static function setTest($string){
        static::$testToken = $string;
    }
}

字符串

sdnqo3pr

sdnqo3pr3#

根据Mockery docs,如果你想模拟公共静态方法,你应该使用alias。
因此,您可以:

Mockery::mock('alias:Illuminate\Support\Str')->shouldReceive('random')->once()->andReturn('some password');

字符串

ndasle7k

ndasle7k4#

您将无法以这种方式模拟Illuminate\Support\Str(请参见mockery docs。这就是我测试它的方式。
在试图生成随机字符串的类中,您可以创建一个方法来生成随机字符串,然后在测试中覆盖该方法(实际上没有测试过的代码):

// class under test
    class Foo {
        public function __construct($otherClass) {
            $this->otherClass = $otherClass;
        }

        public function doSomethingWithRandomString() {
            $random = $this->getRandomString();
            $this->otherClass->useRandomString($random);
        }

        protected function getRandomString() {
            return \Illuminate\Support\Str::random();
        }
    }

    // test file
    class FooTest {
        protected function fakeFooWithOtherClass() {
            $fakeOtherClass = Mockery::mock('OtherClass');
            $fakeFoo = new FakeFoo($fakeOtherClass);
            return array($fakeFoo, $fakeOtherClass);
        }

        function test_doSomethingWithRandomString_callsGetRandomString() {
             list($foo) = $this->fakeFooWithOtherClass();
             $foo->doSomethingWithRandomString();
             
             $this->assertEquals(1, $foo->getRandomStringCallCount);
        }

        function test_doSomethingWithRandomString_callsUseRandomStringOnOtherClassWithResultOfGetRandomString() {
            list($foo, $otherClass) = $this->fakeFooWithOtherClass();

            $otherClass->shouldReceive('useRandomString')->once()->with('fake random');
            $foo->doSomethingWithRandomString();
        }
    }
    class FakeFoo extends Foo {
        public $getRandomStringCallCount = 0;
        protected function getRandomString() {
            $this->getRandomStringCallCount ++;
            return 'fake random';
        }
    }

字符串

相关问题