我有一个使用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');
答案 0 :(得分:0)
你不可能以这种方式嘲笑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';
}
}
答案 1 :(得分:0)
您不能使用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;
}
}
答案 2 :(得分:0)
只要您还使用 IoC 来解析该类的绑定,您尝试的方法就会起作用。
$instance = resolve(\Illuminate\Support\Str::class);
$instance::random();