我正在尝试用phpspec测试一个非常简单的类。
类中需要测试的一些方法
/**
* @param Store $session
*/
function __construct(Store $session)
{
$this->session = $session;
}
/**
* @param Store $session
*/
function __construct(Store $session)
{
$this->session = $session;
}
/**
* Set the current order id
*
* @param $orderId
*/
public function setCurrentOrderId($orderId)
{
$this->session->set($this->sessionVariableName, $orderId);
return $this;
}
/**
* Get the current order id
*
* @return mixed
*/
public function getCurrentOrderId()
{
return $this->session->get($this->sessionVariableName);
}
和一段测试
use IlluminateSessionStore;
class CheckoutSpec extends ObjectBehavior
{
function let(Store $session)
{
$this->beConstructedWith($session);
}
function it_is_initializable()
{
$this->shouldHaveType('SpatieCheckoutCheckout');
}
function it_stores_an_orderId()
{
$this->setCurrentOrderId('testvalue');
$this->getCurrentOrderId()->shouldReturn('testvalue');
}
}
不幸的是,it_stores_an_orderId
上的测试失败了,expected "testvalue", but got null.
将setCurrentOrderId
和getCurrentOrderId
方法应用于工匠修补,效果良好。
在我的测试环境中,似乎会话的设置有问题。
如何解决这个问题?
您实际上要测试的不仅仅是您的类。PHPSpec规范(以及一般的单元测试)应该是独立运行的。
在这种情况下,您真正想要的是确保您的类按预期工作,不是吗?只需模拟Store类,只检查是否调用了它的必要方法,并模拟它们的返回结果(如果有的话)。这样,您仍然可以知道您的类是按预期工作的,并且不会测试已经彻底测试过的内容。
你可以这样做:
function it_stores_an_orderId(Store $session)
{
$store->set('testvalue')->shouldBeCalled();
$store->get('testvalue')->shouldBeCalled()->willReturn('testvalue');
$this->setCurrentOrderId('testvalue');
$this->getCurrentOrderId()->shouldReturn('testvalue');
}
如果您仍然希望直接涉及其他类,那么像Codeception或PHPUnit这样的东西可能更合适,因为您可以更多地控制您的测试环境。
然而,如果你仍然想在PHPSpec中做到这一点,使用这个包可能是可能的(我自己还没有尝试过,所以不能保证)。