2015-01-21 22 views
5

Sınıflarımda birim testleri oluşturmak için ilk kez Prophecy ("phpspec/prophecy-phpunit") kullanmak istiyorum. BenKehanet ile sınamakta olduğunuz sınıftan bir yöntem nasıl yapılır?

class UserManager 
{ 
    private $em; 
    private $passwordHelper; 

    public function __construct(\Doctrine\ORM\EntityManager $em, \MainBundle\Helper\PasswordHelper $passwordHelper) 
    { 
     $this->em = $em; 
     $this->passwordHelper = $passwordHelper; 
    } 

    public function getUserForLdapLogin($ldapUser) 
    { 
      $dbUser = $this 
       ->em 
       ->getRepository('MainBundle:User') 
       ->findOneBy(array('username' => $ldapUser->getUsername())); 

     return (!$dbUser) ? 
       $this->createUserFromLdap($ldapUser) : 
       $this->updateUserFromLdap($ldapUser, $dbUser); 
    } 

İlk sorun ben findOneByUsername o kullanıyordum ve Kehanet, bildiğim kadarıyla bilgim giderse, size izin vermez: Ben aynı serviste başka işlevini çağıran bir işlev test etmek istiyorum, burada kod : alamıyorum sihirli yöntemleri (EntityRepository için _call), yok test yöntemleri sınıf, alay etmeyin. Bunlar doğruysa biraz turşu yapıyorum, yani sınıftaki diğer işlevleri test etmeden bu işlevi test edemem.

Şimdiye kadar, benim test şöyle görünür: $em üzerine sözler ve depo yerine getirilmemesi nedeniyle

class UserManagerTest extends \Prophecy\PhpUnit\ProphecyTestCase 
{ 

     public function testGetUserForLdapLoginWithNoUser() 
     { 
      $ldapUser = new LdapUser(); 
      $ldapUser->setUsername('username'); 

      $em = $this->prophesize('Doctrine\ORM\EntityManager'); 
      $passwordHelper = $this->prophesize('MainBundle\Helper\PasswordHelper'); 

      $repository = $this->prophesize('Doctrine\ORM\EntityRepository'); 
      $em->getRepository('MainBundle:User')->willReturn($repository); 
      $repository->findOneBy(array('username' => 'username'))->willReturn(null); 

      $em->getRepository('MainBundle:User')->shouldBeCalled(); 
      $repository->findOneBy(array('username' => 'username'))->shouldBeCalled(); 

      $service = $this->prophesize('MainBundle\Helper\UserManager') 
      ->willBeConstructedWith(array($em->reveal(), $passwordHelper->reveal())); 

      $service->reveal(); 
      $service->getUserForLdapLogin($ldapUser); 
    } 
} 

Ve tabii

, testler başarısız. Test ettiğim sınıfı başlatırsam, sınama başarısız olur, çünkü işlev aynı sınıfta numaralı telefonu arar ve sınanmaz.

Herhangi bir öneriniz var mı?

+0

Hiç kullanmadım, bu yüzden kendime yardım edemiyorum.Yine de birkaç gün içinde hala sıkışmış iseniz (yani bir soru ödülünü uygulayabiliyorsanız), beni @halfer ile ping edeceğim ve bir tane ekleyeceğim. İyi soru! – halfer

+0

Şimdiye kadar bulduğum en iyi cevap, sınıfınızın muhtemelen S.O.L.I.D prensiplerini takip etmediği ve tek bir sorumluluğu olmadığıdır. Yani kehaneti kullanmaya başlamadan önce sınıfınızı düz tutun. – anegrea

cevap

0

İlk sorun:

büyü kullanmayın, sihirli kötüdür. __call öngörülemeyen davranışlara yol açabilir.

"$ em üzerine sözler ve depo yerine getirilmemesi": kodunuzu yapmayın

Class ama Arayüz bağlıdır. Ardından, Sınıf yerine Arayüzle alay edin! EntityManager yerine ObjectManager ile alay etmeniz gerekir.

önce ortaya:

Ve son noktayı (Parametrelerinizde türünü değiştirmek için unutmayın).

$service->createUserFromLdap() 
    ->shouldBeCalled() 
    ->willReturn(null); 
0

var olmayan yöntemler alay etmek mümkün olmayan sorununuza ilgili olarak, sen kehanetin yerine

http://docs.mockery.io/en/latest/

kullanabilirsiniz. Mockery sadece bunu yapmanıza izin veriyor. Kesinlikle, bu, iyi tasarım kurallarının bazılarını bozar, ancak diğer yandan, bazen sadece çok faydalıdır. Her neyse, alay özellikleri özellikleri kadar çok benzer ve aynı derecede imo ve sezgisel ve kullanımı kolay. Ancak, hala kararlı bir sürüm yayınlamıyorlar, bu yüzden sadece kullanmaya karar verirseniz bunun farkında ol.

Burada Ne elde etmeye çalıştığınız Kehanet tarafından desteklenmeyen bir kısmi sahte, iki kütüphaneler

http://everzet.com/post/72910908762/conceptual-difference-between-mockery-and-prophecy

İlgili konular