【问题标题】:Laravel Mockery Failing TestLaravel 嘲弄测试失败
【发布时间】:2019-02-27 10:02:50
【问题描述】:

我只是想知道,我正在尝试创建这个测试用例,但是它一直失败。使用 Mockery 有什么遗漏的地方吗?

 /** @test */
function can_store_podcast_thumbnail()
{
    $podcast = factory(Podcast::class)->make([
        'feed_thumbnail_location' => 'https://media.simplecast.com/podcast/image/279/1413649662-artwork.jpg',
    ]);

    $mockedService = Mockery::mock(\App\PodcastUploadService::class);
    $mockedService->shouldReceive('storePodcastThumbnail')
        ->with($podcast)
        ->once()
        ->andReturn(true);

    $podcastUploadService = new \App\PodcastUploadService();
    $podcastUploadService->storePodcastThumbnail($podcast);
}

这是我得到的错误:

Mockery\Exception\InvalidCountException: Method storePodcastThumbnail(object(App\Podcast)) from Mockery_2_App_PodcastUploadService should be called

正好 1 次,但调用了 0 次。

只是想知道,

谢谢!

【问题讨论】:

  • 你必须使用 mockery 来模拟你正在测试的类的依赖关系
  • 嘿,你能举个例子吗?
  • 我添加了一个关于如何将其用作答案的示例

标签: php phpunit tdd mockery


【解决方案1】:

假设你要测试 Bar 类,它依赖于 Foo 类:

/**
 * This is the Dependency class
 */
class Foo
{
    public function fooAction()
    {
        return 'foo action';
    }
}

/*
 * This is the class you want to test, which depends on Foo
 */
class Bar
{
    private $foo;

    public function __construct(Foo $foo)
    {
        $this->foo = $foo;
    }

    public function barAction()
    {
        return $this->foo->fooAction();
    }
}

现在在您的条形测试中,您会说当您运行 barAction() 时,您希望调用 fooAction() 并返回一个模拟结果:

$fooMock = Mockery::mock(Foo::class);
$barTest = new Bar($fooMock);

$fooMock->shouldReceive('fooAction')->andReturn('mockReturn');

$result = $barTest->barAction();

$this->assertEquals('mockReturn', $result);

在示例中,我在构造函数级别传递了 Foo 对象,但如果在函数级别传递它,则效果相同

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2014-07-24
    • 2015-01-25
    • 1970-01-01
    • 2021-03-03
    • 2020-09-06
    • 2018-08-14
    • 2016-03-24
    • 2017-09-01
    • 2019-08-03
    相关资源
    最近更新 更多