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ı?
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
Ş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