1

テストするコード:

// Add the activation provider argument to the factory definition
$factoryDefinition = $container->getDefinition('gremo_subscription_factory');
$factoryDefinition->addArgument(new Reference($providerId));

テストメソッドは、引数addArgumentを含めてメソッドをチェックする必要があります。$providerId私はPHPUnitを学習しているだけで、今は呼び出すことしかできません$this->anything()

$container->expects($this->at(3))
    ->method('getDefinition')
    ->with('gremo_subscription_factory')
    ->will($this->returnValue($factory));

$factory->expects($this->once())
    ->method('addArgument')
    ->with($this->anything());

$this->pass->process($container);

Reference引数の型がクラスであり、(順番に)その引数が正確に文字列であることを確認するにはどうすればよい$providerIdですか?

4

1 に答える 1

2

これはかなり複雑です。特に、Referenceクラスには依存性が注入されておらず、メソッド呼び出しは何も返さないためです。ただし、引数制約を使用して回避できると思います。2番目の句を実行する方法は次のとおりです。

$factory->expects($this->once())
    ->method('addArgument')
    ->with($this->logicalAnd(
        $this->isInstanceOf('Reference'),
        $this->attributeEqualTo('attribute', $providerId)
    ));

の2番目の項目は、logicalAnd()基本的に、Reference作成されたオブジェクトをチェックして、$providerId正しく割り当てられているかどうかを確認することです(コンストラクターで何が起こるかは$providerIdわかりませんReferenceが、インスタンス変数などに保存されると想定しています)。

ただし、この種のことは、クラスの実装の詳細をテストする領域に移行しているReferenceため、このようなテストはSRPを維持するのに適していません。これらはすべて、コードをリファクタリングすることでより適切に解決されます。一般的に言って、テストが難しい場合は、おそらくテストスイートのせいではありません。可能であれば、過度に巧妙なテストを作成するのではなく、最初にその側で物事を変更することを検討してください。

于 2012-12-14T02:58:15.477 に答える