Laravel Mailer-PHPUnit测试-模拟不起作用

Laravel Mailer-PHPUnit测试-模拟不起作用,php,unit-testing,laravel,mocking,phpunit,Php,Unit Testing,Laravel,Mocking,Phpunit,我试图对一些引发电子邮件的事件进行单元测试。特别是,我想测试发送的电子邮件 错误在于模拟对象上不存在getTransport()。 我添加了shouldReceive('getTransport'),但是我还必须模拟它返回的内容,然后模拟返回的模拟对象上调用的函数。。。等等 我的事件侦听器中的代码: $data = compact('pusher', 'product', 'time', 'contact'); Mail::send('emails.sms.oos', $data

我试图对一些引发电子邮件的事件进行单元测试。特别是,我想测试发送的电子邮件

错误在于模拟对象上不存在getTransport()。 我添加了shouldReceive('getTransport'),但是我还必须模拟它返回的内容,然后模拟返回的模拟对象上调用的函数。。。等等

我的事件侦听器中的代码:

    $data = compact('pusher', 'product', 'time', 'contact');
    Mail::send('emails.sms.oos', $data, function($message) {
        $message->to('ben@me.com')->subject('');
        $message->from('me@newaverfid.com');
    });
我的测试:

    // Set the expected calls
    $mock->shouldReceive('send')
        ->once()
        ->with(
            'emails.sms.oos',
            m::on(function ($data) {
                $this->assertArrayHasKey('pusher', $data);
                return true;
            }),
            m::on( function(\Closure $closure) use ($location, $client, $contact, $reader, $pusher){
                $message = m::mock('Illuminate\Mailer\Message');
                $message->shouldReceive('to')->once()->with($contact->cellEmail())
                    ->andReturn($message);
                $message->shouldReceive('subject')->once()->with('');
                $message->shouldReceive('from')->once()->with('me@newaverfid.com');
                $closure($message);
                return true;
            })
        );
而且。。。我的错误:

1) InventoryEventsTest::it_only_emails_contacts_for_the_specific_location
BadMethodCallException: Method Mockery_1_Swift_Mailer::getTransport() does not exist on this mock object

C:\xampp\htdocs\dev\newdash\vendor\laravel\framework\src\Illuminate\Mail\Mailer.php:315
C:\xampp\htdocs\dev\newdash\vendor\laravel\framework\src\Illuminate\Mail\Mailer.php:159
C:\xampp\htdocs\dev\newdash\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php:222
C:\xampp\htdocs\dev\newdash\app\Listeners\SMSInventoryOutOfStockNotification.php:47
C:\xampp\htdocs\dev\newdash\app\Listeners\SMSInventoryOutOfStockNotification.php:47
C:\xampp\htdocs\dev\newdash\tests\Integrated\InventoryEventsTest.php:157
C:\xampp\php\pear\PHPUnit\TextUI\Command.php:176
C:\xampp\php\pear\PHPUnit\TextUI\Command.php:129
您可以将mock设为a,因此您只需模拟需要模拟的方法(在您的示例中是Mail::send()方法)。对没有定义期望值的方法的调用,例如在您的例子中的getTransport()方法,将在模拟的父类“unmocked”上调用。可以按如下方式指定部分模拟:

如果模拟是一个变量:

$mock->makePartial();
直接在立面上指定:

Mail::makePartial();

makePartial()方法应该在定义期望值后调用。

当我这样做时,我得到一个新的错误致命错误:在C:\xampp\htdocs\dev\newdash\vendor\laravel\framework\src\illumb\Mail\Mailer.php的第315行对非对象调用成员函数stop(),那么您的期望值一定不正确(with()-方法中的参数与实际发送的不匹配),因此它使用的是真正的send()方法,而不是模拟。如果将模拟更改为
$mock->shouldReceive('send')->once();
,这是否有效?是的,它只与
->shouldReceive('send')->once()一起工作
但不是所有其他方法……我想我会更多地使用它。。。