- NAME
- VERSION
- SYNOPSIS
- DESCRIPTION
  - Methods
    - _setup()
    - get_instance()
    - create_instance()
    - get_module_name()
    - run_on_module($set_value)
    - run_test_cases($cases)
  - Options
    - method
    - params
    - exp
    - name
    - pre_test_hook
    - post_test_hook
- AUTHOR

# NAME

Test::Class::Simple - simplify your unit tests writing based on Test::Class

# VERSION

version 0.01

# SYNOPSIS

      package My::Example;

      sub new {
        my $class = shift;

        $class = ref($class) || $class;
        my $self = { _counter => 0 };
        bless $self, $class;
        return $self;
      }

      sub increase_counter {
        my $self = shift;

        $self->{_counter}++;
        return $self->{_counter};
      }

      package My::Example::Test;
      use parent qw(Test::Class::Simple);

      # setup methods are run before every test method.
      sub _setup {
        my $self = shift;

        # get mocked object of the class that is Test::MockObject::Extends
        my $instance = $self->get_instance();
        $instance->{_counter} = 100;
        return;
      }

      # Set which class should be mocked
      sub get_module_name {
        return 'My::Example';
      }

      # Indicate that instance should be created
      sub create_instance {
        return 1;
      }

      # a test method that runs 1 test
      sub test_counter : Test(2) {
        my $self = shift;

        my $test_cases = [
          {
            method => 'increase_counter',
            params => [],
            exp    => 101,
            name   => 'Increase counter once',
          },
          {
            method => 'increase_counter',
            params => [],
            exp    => 102,
            name   => 'Increase counter twice',
          },
        ];
        $self->run_test_cases($test_cases);
        return;
      }

later in a nearby .t file

      #! /usr/bin/perl
      use My::Example::Test;

      # run all the test methods in My::Example::Test
      My::Example::Test->new()->runtests();
      exit 0;

# DESCRIPTION

This is an extension of Test::Class module to implement unit tests in more simple and declarative way.

## Methods

### _setup()

Method that is executed before every test method and is useful for some initializations required for the tests.

### get_instance()

Returns mocked object of the class specified in get_module_name(). If create_instance() is set to false, returns `undef` value.

### create_instance()

Can be overridden and must return boolean value. Indicates whether mocked instance should be created.

### get_module_name()

Must be overridden and should return name of the module for which tests should be run.

### run_on_module($set_value)

Sets boolean value that indicates that tests should run against the module rather then the instance of the class.

### run_test_cases($cases)

Accepts arrayref of the test cases described with options inside hash references and executes them one by one.

## Options

### method

Name of the method that should be executed.

### params

Array reference of the parameters that should be passed to the method

### exp

Can be either data structure or a code reference. For data structure cmp_deeply will be executed. If code reference is set then result will be passed as a single parameter and will be expected to return true value if test case was considered as successful.

### name

Name of the test case. Usually shown in the output of test run.

### pre_test_hook

Code reference that will be executed before current test case. E.g. for mocking data for next test case.

### post_test_hook

Code reference that will be executed after current test case. E.g. for unmocking data.

# AUTHOR

Oleksii Kysil