5

多分私はこれを間違っています。

モデル (Antibody) の beforeSave メソッドをテストしたいと思います。このメソッドの一部は、関連付けられたモデル (Species) のメソッドを呼び出します。Species モデルをモックしたいのですが、方法がわかりません。

それは可能ですか、それともMVCパターンに反することをしているので、すべきではないことをしようとしていますか?

class Antibody extends AppModel {
    public function beforeSave() {

        // some processing ...

        // retreive species_id based on the input 
        $this->data['Antibody']['species_id'] 
            = isset($this->data['Species']['name']) 
            ? $this->Species->getIdByName($this->data['Species']['name']) 
            : null;

        return true;
    }
}
4

2 に答える 2

6

関係のために Cake によって作成された Species モデルを想定すると、次のように簡単に実行できます。

public function setUp()
{
    parent::setUp();

    $this->Antibody = ClassRegistry::init('Antibody');
    $this->Antibody->Species = $this->getMock('Species');

    // now you can set your expectations here
    $this->Antibody->Species->expects($this->any())
        ->method('getIdByName')
        ->will($this->returnValue(/*your value here*/));
}

public function testBeforeFilter()
{
    // or here
    $this->Antibody->Species->expects($this->once())
        ->method('getIdByName')
        ->will($this->returnValue(/*your value here*/));
}
于 2012-06-22T10:58:47.323 に答える
0

まあ、それはあなたの「種」オブジェクトが注入される方法に依存します。コンストラクター経由で注入されますか? セッター経由?継承されていますか?

以下は、オブジェクトを注入したコンストラクターの例です。

class Foo
{
    /** @var Bar */
    protected $bar;

    public function __construct($bar)
    {
        $this->bar = $bar;
    }

    public function foo() {

        if ($this->bar->isOk()) {
            return true;
        } else {
            return false;
        }
    }
}

次に、テストは次のようになります。

public function test_foo()
{
    $barStub = $this->getMock('Overblog\CommonBundle\TestUtils\Bar');
    $barStub->expects($this->once())
        ->method('isOk')
        ->will($this->returnValue(false));

    $foo = new Foo($barStub);
    $this->assertFalse($foo->foo());
}

このプロセスは、setter が注入されたオブジェクトの場合とまったく同じです。

public function test_foo()
{
    $barStub = $this->getMock('Overblog\CommonBundle\TestUtils\Bar');
    $barStub->expects($this->once())
        ->method('isOk')
        ->will($this->returnValue(false));

    $foo = new Foo();
    $foo->setBar($barStub);
    $this->assertFalse($foo->foo());
}
于 2012-06-22T09:48:24.290 に答える