これは、スタック オーバーフローに対する私の最初の質問です。いくつかのルールに違反している場合は、事前にお詫び申し上げます。
Perl モジュールのテストと Test::More の機能の使用について説明している Intermediate Perl, 2nd ed. の第 14 章を読んでいます。この本の「最初のテストを追加する」というタイトルのセクションで直接公開されているコードを参照しています。
背景として、この章ではAnimal、同じ名前のモジュールにサンプル クラスが作成されます。このクラスには、speak次のような単純なメソッドがあります。
sub speak {
my $class = shift;
print "a $class goes ", $class->sound, "!\n";
}
メソッドは特定の動物に対して返される単純な文字列です。soundたとえば、馬のsoundメソッドは単純sub sound { "neigh" }になり、そのspeakメソッドは次のように出力する必要があります。
A Horse goes neigh!
私が直面している問題は次のとおりです: ./Animal/t/Animal.t で作成したテスト コードでは、ベア ブロックを使用し、メソッドが機能Test::More::isしていることをテストするように指示されています。speakコードは、テスト ファイルで次のようになります。
[test code snip]
{
package Foofle;
use parent qw(Animal);
sub sound { 'foof' }
is( Foofle->speak,
"A Foofle goes foof!\n",
"An Animal subclass does the right thing"
);
}
テストは失敗します。すべてのビルド コマンドを実行しましたが、「ビルド テスト」を実行すると、アニマル テストで次のエラーが発生します。
Undefined subroutine &Foofle::is called at t/Animal.t line 28.
Test::More::isプレーンの代わりに明示的に使用しようとするとis、テストはまだ失敗し、次のメッセージが表示されます。
# Failed test 'An Animal subclass does the right thing'
# at t/Animal.t line 28.
# got: '1'
# expected: 'A Foofle goes foof!
# '
私のメソッドは、私が説明したとおりに定義されているようです。最初のエラーは、むき出しのブロックによるスコープの問題だと思いますが、100% 確実ではありません。2 番目のエラーについては不明です。Foofleクラスを子として作成しAnimalて呼び出しspeakた場合、1 の応答が得られず、期待される出力が得られるためです。
誰かが私が間違っているかもしれないことを手伝ってくれるでしょうか? おそらく関連するソフトウェア バージョンとして、perl v5.16、Test::More v0.98、および Module::Starter v1.58 を使用しています。