2016-05-16 17 views
0

私のコードは次のとおりです。なぜlaravelアサーションがクロージャから呼び出されないのですか?

public function testOne() 
{ 
    $mail = ['subject' => 'My subject']; 

    $this->assertEquals(1, 1); 
    $mock = Mockery::mock(\Illuminate\Support\Facades\Mail::getSwiftMailer()); 
    $this->app['mailer']->setSwiftMailer($mock); 
    $msg = $mock->shouldReceive('send')->once()->andReturnUsing(function($msg) { 
     echo $msg->getSubject(); 
     $this->assertEquals($mail['subject'], $msg->getSubject()); 
    }); 
    $this->assertEquals(1, 1); 
} 

私は出力を得る:

PHPUnit 4.8.24 by Sebastian Bergmann and contributors. 

My subject 

Time: 852 ms, Memory: 26.00Mb 

OK (1 test, 2 assertions) 

を私は出力から参照してください。私は、なぜ、良い件名を取得しますが、何もアサートされていない

echo $msg->getSubject(); 

?あなたのclosureインサイドこの

public function testOne() 
{ 
    $mail = ['subject' => 'My subject']; 

    $this->assertEquals(1, 1); 
    $mock = Mockery::mock(\Illuminate\Support\Facades\Mail::getSwiftMailer()); 
    $this->app['mailer']->setSwiftMailer($mock); 
    $obj = $this; 
    $msg = $mock->shouldReceive('send')->once()->andReturnUsing(function($msg) use ($obj, $mail) { 
     echo $msg->getSubject(); 
     $obj->assertEquals($mail['subject'], $msg->getSubject()); 
    }); 
    $this->assertEquals(1, 1); 
} 

よう

答えて

0

使用して、それはそう、それはあなたがそれを使用する別の変数&に割り当てる必要があり、そのためにそこから$thisを取得することはありませんClosureのインスタンスです。

But you can rewrite your tests like this

public function testOne() 
{ 
    $mail = ['subject' => 'My subject']; 

    $this->assertEquals(1, 1); 
    $mock = Mockery::mock(\Illuminate\Support\Facades\Mail::getSwiftMailer()); 
    $this->app['mailer']->setSwiftMailer($mock); 
    $message = null; 
    $mock->shouldReceive('send')->once()->andReturnUsing(function($msg) use ($message) { 
     $message = $msg->getSubject(); 
    }); 
    $this->assertEquals($mail['subject'], $message); 
    $this->assertEquals(1, 1); 
} 
+0

何らかのエラーがクロージャの内部で発生した場合があり、それが真実であるように偽のアサーションが閉鎖laravel印刷の内側があれば、あなたのソリューションとの奇妙なエラーは、ある....そしてより... – fico7489

+0

あなたはあなたのテストを書き直すこともできます。 @ fico7489 –

+0

2番目のスニペットは "class Mockery \ CompositeExpectation"オブジェクトではなく文字列を返します。 – fico7489

関連する問題