nysus has asked for the wisdom of the Perl Monks concerning the following question:

I have the following bit of code:

use Test::NoWarnings; use Test::Warn; warning_like ( sub { $obj->get_member_id_by_name('smith'); }, qr /than +/, 'warns when more than one name returned' );

So, I'm expecting my code to throw a warning. However, even though I want a warning for this one test, Test::NoWarnings is throwing a warning. I tried to suppress the warning with the following:

my $had_no_warnings; if (had_no_warnings) { $had_no_warnings = 1; } warning_like ( sub { $obj->get_member_id_by_name('smith'); }, qr /than +/, 'warns when more than one name returned' ); clear_warnings if $had_no_warnings;

However, this had no effect. Any way to suppress wanted warnings from the output of Test::NoWarnings?

$PM = "Perl Monk's";
$MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest";
$nysus = $PM . ' ' . $MCF;
Click here if you love Perl Monks

Replies are listed 'Best First'.
Re: Suppressing desired warnings from output of Test::NoWarnings
by haukex (Archbishop) on Jun 26, 2018 at 19:02 UTC
    Test::NoWarnings is throwing a warning.

    Which warning is that? Please show an SSCCE that reproduces the issue.

    use warnings; use strict; use Test::More tests=>2; use Test::NoWarnings; use Test::Warn; sub Foo::get_member_id_by_name { warn "foo than bar" }; my $obj = bless {}, 'Foo'; warning_like ( sub { $obj->get_member_id_by_name('smith'); }, qr/than/, 'warns when more than one name returned' ); __END__ 1..2 ok 1 - warns when more than one name returned ok 2 - no warnings

    By the way, here's the code I use to test warnings:

    sub warns (&) { my $sub = shift; my @warns; { local $SIG{__WARN__} = sub { push @warns, shift }; $sub->() } return wantarray ? @warns : scalar @warns; } print "<$_>\n" for warns { warn "Hello"; warn "World" } __END__ <Hello at - line 8. > <World at - line 8. >

    And I've learned it's not a good idea to expect a specific number of warnings, since different versions of Perl may issue different warnings. Just do my @warns = warns {...}; and then grep the array for the warning(s) you do or don't expect.

    Update: Typo fix.

      My bad. Error was actually coming from another test that I forgot to wrap in a warning_like() test. Thanks for the tip.

      $PM = "Perl Monk's";
      $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest";
      $nysus = $PM . ' ' . $MCF;
      Click here if you love Perl Monks

Re: Suppressing desired warnings from output of Test::NoWarnings
by tobyink (Canon) on Jun 28, 2018 at 12:29 UTC
Re: Suppressing desired warnings from output of Test::NoWarnings
by Veltro (Hermit) on Jun 26, 2018 at 17:45 UTC

    I think your code doesn't work because it contains errors

    I suggest adding:

    use strict ; use warnings ;

    I did a small test myself, see results below:

    use strict ; use warnings ; use Test::More ; use Test::Warn; warning_like ( sub { warn "Hello"; }, qr /Hello/, 'Hello warning' ) ; done_testing() ; __END__ ok 1 - Hello warning 1..1
Re: Suppressing desired warnings from output of Test::NoWarnings
by nysus (Parson) on Jun 26, 2018 at 17:33 UTC

    OK, was able to get my solution working by calling the clear warnings with its full name: &Test::NoWarnings::clear_warnings.

    However, this does seem convoluted. Perhaps there is a better way?

    $PM = "Perl Monk's";
    $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest";
    $nysus = $PM . ' ' . $MCF;
    Click here if you love Perl Monks