# NAME

Test::Mock::Guard - Simple mock test library using RAII.

# SYNOPSIS

   use Test::More;
   use Test::Mock::Guard qw(mock_guard);

   package Some::Class;

   sub new { bless {} => shift }
   sub foo { "foo" }
   sub bar { 1; }

   package main;

   {
       my $guard = mock_guard( 'Some::Class', { foo => sub { "bar" }, bar => 10 } );
       my $obj = Some::Class->new;
       is( $obj->foo, "bar" );
       is( $obj->bar, 10 );
   }

   my $obj = Some::Class->new;
   is( $obj->foo, "foo" );
   is( $obj->bar, 1 );

   done_testing;

# DESCRIPTION

Test::Mock::Guard is mock test library using RAII.
This module is able to change method behavior by each scope. See SYNOPSIS's sample code.

# EXPORT FUNCTION

## mock\_guard( @class\_defs )

@class\_defs have the following format.

- key

   Class name or object to mock.

- value

   Hash reference. Keys are method names; values are code references or scalars.
   If the value is code reference, it is used as a method.
   If the value is a scalar, the method will return the specified value.

You can mock instance methods as well as class methods (this feature was provided by cho45):

   use Test::More;
   use Test::Mock::Guard qw(mock_guard);

   package Some::Class;

   sub new { bless {} => shift }
   sub foo { "foo" }

   package main;

   my $obj1 = Some::Class->new;
   my $obj2 = Some::Class->new;

   {
       my $obj2 = Some::Class->new;
       my $guard = mock_guard( $obj2, { foo => sub { "bar" } } );
       is ($obj1->foo, "foo", "obj1 has not changed" );
       is( $obj2->foo, "bar", "obj2 is mocked" );
   }

   is( $obj1->foo, "foo", "obj1" );
   is( $obj2->foo, "foo", "obj2" );

   done_testing;

# METHODS

## new( @class\_defs )

See ["mock_guard"](#mock_guard) definition.

## call\_count( $class\_name\_or\_object, $method\_name )

Returns a number of calling of $method\_name in $class\_name\_or\_object.

# AUTHOR

Toru Yamaguchi <[email protected]>

Yuji Shimada <xaicron at cpan.org>

Masaki Nakagawa <[email protected]>

# THANKS TO

cho45 <[email protected]>

# SEE ALSO

[Test::MockObject](https://metacpan.org/pod/Test::MockObject)

# LICENSE

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.