1

経験豊富なPHPUnitユーザーにとっては非常に簡単に解決できると思う小さな問題があります。

私はZF2を使用しています。

プレーンテキスト(CSV)を返すWebサービスを使用しています。作成したサービスの単体テストをしたいのですが。私は現在、それを行うための正しい方法ではない動作構成を持っています。モデルをユニットテストしているときにモックを使用していて、PHPUnitにWebサービス用の特別なモックがあることを確認しましたが、それだけです。 WSDLをサポートします。

その下に私のコードがあり、誰かがこの状況のベストプラクティスについての説明を手伝ってくれることを願っています。

ここにあるドキュメントとトピックは(まだ)私を助けませんでした。

前もって感謝します!

テスト自体:

public function testCanSearchSteeringWheels()
{
    // Create the entry and fill it with the data that should be retrieved from the web service
    $steeringWheelEntity = new SteeringWheelEntity();
    $steeringWheelEntity->setId('170633')
                        ->setName('Nice steering wheel one')
                        ->setGrossPrice(100)
                        ->setNetPrice(75);    

    // Setup the http client which whill make the final call to the web service
    $httpClient = new Client();
    $httpClient->setOptions(array(
        'maxredirects' => 5,
        'timeout'      => 60,
    ))
    ->setAuth($this->config['supplier_name']['api']['username'], $this->config['supplier_name']['api']['password'])
    ;

    $steeringWheelService = new SteeringWheelService($httpClient, new Request(), $this->config['supplier_name']);

    // Search for a steering wheel by id code
    $searchResult = $steeringWheelService->search('ID=5221552658987');

    $this->assertEquals($steeringWheelEntity, $searchResult[0]);
}

SteeringWheelEntity

namespace SupplierName\Entity;

class SteeringWheelEntity
{
    // vars
    // exchange array method
    // getters methods
    // setters methods
}

SteeringWheelService

namespace SupplierName\Service;

use SupplierName\Entity\SteeringWheelEntity;

class SteeringWheelService extends AbstractWebService
{           
    /**
     * search()
     * 
     * @param string $param
     * @return array
     */
    public function search($param)
    {
        $this->appendUrl('ww0800?3,' . $param);

        $response   = $this->dispatch();                
        $parsedBody = $this->parse($response->getBody());
        $entities   = array();

        foreach ($parsedBody as $data)
        {
            $steeringWheel = new SteeringWheelEntity();
            // Fill SteeringWheelEntity with data
            $entities[] = $steeringWheel;
        }

        return $entities;
    }
}

AbstractWebService

use \Zend\Http\Client;
use \Zend\Http\Request;

class AbstractWebService
{
    private $httpClient;
    private $request;
    private $response;

    protected $config;

    private $url;

    public function __construct(Client $httpClient, Request $request, Array $config)
    {  
        $this->url        = $config['api']['url'];        
        $this->httpClient = $httpClient;        
        $this->request    = $request;        
        $this->config     = $config;
    }

    protected function setUrl($url)
    {
        $this->url = $url;

        return $this->url;
    }

    protected function appendUrl($string)
    {
        $this->url .= $string;
    }

    protected function getUrl()
    {
        return $this->url;
    }

    public function dispatch()
    {
        $this->request->setUri($this->getUrl());

        $this->response = $this->httpClient->dispatch($this->request);

        if (!$this->response->isSuccess()) {
            throw new \Exception('HTTP error #' . $this->response->getStatusCode() . ' when connecting to ' . $this->getUrl() . '.');
        }

        return $this->response;
    }

    public function parse()
    {
        // Parse the content
    }
}
4

1 に答える 1

3

Webサービスにモックを使用するのではなく。\Zend\Http\Request彼らがあなたのために仕事をしているので、あなたはただとオブジェクトをあざけることができ\Zend\Http\Clientますか?このようにして、Webサービスをモックしようとするのではなく、Zendオブジェクトが返すものを制御できます。

それが私がサービスをテストする方法です。

于 2013-03-12T22:23:03.807 に答える