# Issue with laminas-test unit testing

**URL:** <https://discourse.laminas.dev/t/issue-with-laminas-test-unit-testing/3681>\
**Category:** Components & MVC\
**Tags:** phpunit, laminas-mvc, laminas-test\
**Created:** [May 2, 2024, 9:03am UTC](https://discourse.laminas.dev/t/issue-with-laminas-test-unit-testing/3681 "2024-05-02T09:03:24Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tharisha\_Perera](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/tharisha_perera/32/1700_2.png) [@Tharisha\_Perera](https://discourse.laminas.dev/u/Tharisha_Perera)\
**Post date:** [May 2, 2024, 9:03am UTC](https://discourse.laminas.dev/t/issue-with-laminas-test-unit-testing/3681/1 "2024-05-02T09:03:24Z")

</div>

I’m new to Laminas framework and Unit testing and working with a Laminas framework project and I want to start unit testing in that application. I used laminas-test package and followed their [tutorial](https://docs.laminas.dev/tutorials/unit-testing/).  
when I execute the `vendor/bin/phpunit` I’m getting the following error.

```
1) CompanyTest\Controller\ManageControllerTest::testDirectoryAction
Laminas\ServiceManager\Exception\ServiceNotCreatedException: Service with name "ModuleManager" could not be created. Reason: Parameter to Laminas\ModuleManager\ModuleManager's Laminas\ModuleManager\ModuleManager::setModules method must be an array or implement the Traversable interface

/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-servicemanager/src/ServiceManager.php:652
/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-servicemanager/src/ServiceManager.php:218
/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-mvc/src/Application.php:263
/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-test/src/PHPUnit/Controller/AbstractControllerTestCase.php:230
/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-test/src/PHPUnit/Controller/AbstractControllerTestCase.php:255
/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-test/src/PHPUnit/Controller/AbstractControllerTestCase.php:344
/var/lxp/sites/cammslearning/production/application/module/Company/test/Controller/ManageControllerTest.php:29

Caused by
Laminas\ModuleManager\Exception\InvalidArgumentException: Parameter to Laminas\ModuleManager\ModuleManager's Laminas\ModuleManager\ModuleManager::setModules method must be an array or implement the Traversable interface

/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-modulemanager/src/ModuleManager.php:262
/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-modulemanager/src/ModuleManager.php:68
/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-mvc/src/Service/ModuleManagerFactory.php:82
/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-servicemanager/src/ServiceManager.php:645
/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-servicemanager/src/ServiceManager.php:218
/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-mvc/src/Application.php:263
/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-test/src/PHPUnit/Controller/AbstractControllerTestCase.php:230
/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-test/src/PHPUnit/Controller/AbstractControllerTestCase.php:255
/var/lxp/sites/cammslearning/production/application/vendor/laminas/laminas-test/src/PHPUnit/Controller/AbstractControllerTestCase.php:344
/var/lxp/sites/cammslearning/production/application/module/Company/test/Controller/ManageControllerTest.php:29

```

This is the sample unit test I wrote

```
<?php
namespace CompanyTest\Controller;

use Company\Controller\ManageController;
use Laminas\Stdlib\ArrayUtils;
use Laminas\Test\PHPUnit\Controller\AbstractHttpControllerTestCase;

class ManageControllerTest extends AbstractHttpControllerTestCase {
    protected $traceError = true;

    protected function setUp(): void {
        $configOverrides = [];

        $configs = [
            include __DIR__. '/../../../../config/application.config.global.php',
            include __DIR__. '/../../../../config/autoload/testing.global.php',
        ];

        $mergedConfig = ArrayUtils::merge(
            $configs,
            $configOverrides
        );
        $this->setApplicationConfig($mergedConfig);

        parent::setUp();
    }

    public function testDirectoryAction () {
        $this->dispatch('/company/directory');
        $this->assertResponseStatusCode(200);
        $this->assertModuleName('Company');
        $this->assertControllerName(ManageController::class);
        $this->assertControllerClass('ManageController');
        $this->assertMatchedRouteName('company/directory');
    }
}

```

I also added `autoload` entry in the `composer.json` as well.

```
   "autoload-dev": {
        "psr-4": {
            "ApplicationTest\\": "module/Application/Test/",
            "CompanyTest\\": "module/Company/test/"
        }
    },    

```

How do I get this running? what are the possible causes for this?

The other relevant files.

**phpunit.xml**

```
<?xml version="1.0" encoding="UTF-8"?>
<phpunit colors="true" bootstrap="./vendor/autoload.php" >
    <testsuites>
        <testsuite name="Laminas MVC Application Test Suite">
            <directory>./module/Application/Test</directory>
        </testsuite>
        <testsuite name="Login">
            <directory>./module/Learner/Authentication/test</directory>
        </testsuite>
        <testsuite name="Company">
            <directory>./module/Company/test</directory>
        </testsuite>
    </testsuites>
</phpunit>

```

**Folder structure**

```
.
└── application/
    ├── config/
    │ ├── application.config.global.php
    │ └── autoload/
    │ └── testing.global.php
    ├── module/
    │ └── Company/
    │ ├── Controller/
    │ │ └── ManageController.php
    │ └── test/
    │ └── Controller/
    │ └── ManageControllerTest.php
    ├── composer.json
    └── phpunit.xml

```

---

<div class="post-metadata">

**Author:** ![Tyrsson](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/tyrsson/32/1664_2.png) [@Tyrsson](https://discourse.laminas.dev/u/Tyrsson)\
**Post date:** [May 2, 2024, 1:41pm UTC](https://discourse.laminas.dev/t/issue-with-laminas-test-unit-testing/3681/2 "2024-05-02T13:41:33Z")

</div>

Welcome to the forum 😁

Is the company module loading as expected during normal execution?

You have to register the company modules in either modules.config.php or application.config.php

Might want to look at the docs for laminas component installer and run a google search for advanced configuration tricks.

I would link you but I’m on mobile.

---

<div class="post-metadata">

**Author:** ![Tyrsson](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/tyrsson/32/1664_2.png) [@Tyrsson](https://discourse.laminas.dev/u/Tyrsson)\
**Post date:** [May 2, 2024, 10:25pm UTC](https://discourse.laminas.dev/t/issue-with-laminas-test-unit-testing/3681/3 "2024-05-02T22:25:25Z")

</div>

This explains in-depth the why’s and how’s of configuring a laminas application.

> **[Advanced Configuration Tricks - tutorials - Laminas Docs](https://docs.laminas.dev/tutorials/advanced-config/)**
>
> Learn how to create laminas-mvc applications, get in-depth guides into components, and discover how to migrate your applications to version 3!

This covers how modules/components are correctly setup in a laminas application by the component installer.

> **[laminas-component-installer - Laminas Docs](https://docs.laminas.dev/laminas-component-installer/)**
>
> Composer plugin for injecting modules and configuration providers into application configuration

The error you are encountering sounds like you do not have an entry in the proper file for the Company module. It requires an entry in the modules array.

The second link addresses your issue here (I think)

> **[laminas-component-installer - Laminas Docs](https://docs.laminas.dev/laminas-component-installer/#modules)**
>
> Composer plugin for injecting modules and configuration providers into application configuration

---

<div class="post-metadata">

**Author:** ![Tharisha\_Perera](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/tharisha_perera/32/1700_2.png) [@Tharisha\_Perera](https://discourse.laminas.dev/u/Tharisha_Perera)\
**Post date:** [May 3, 2024, 9:28am UTC](https://discourse.laminas.dev/t/issue-with-laminas-test-unit-testing/3681/4 "2024-05-03T09:28:15Z")

</div>

Hi Tyrsson, Thank you for replying.

Yes, the company module is loading during the normal execution and it is registered in the application.config.global.php.

I’m only getting this error when trying to write and execute a unit test and I get the same error for other modules as well.

I’ll check the laminas-component-installer.

---

<div class="post-metadata">

**Author:** ![Tyrsson](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/tyrsson/32/1664_2.png) [@Tyrsson](https://discourse.laminas.dev/u/Tyrsson)\
**Post date:** [May 3, 2024, 12:37pm UTC](https://discourse.laminas.dev/t/issue-with-laminas-test-unit-testing/3681/5 "2024-05-03T12:37:37Z")

</div>

> [@Tharisha\_Perera](#):
>
> `Laminas\ModuleManager\Exception\InvalidArgumentException: Parameter to Laminas\ModuleManager\ModuleManager's Laminas\ModuleManager\ModuleManager::setModules method must be an array or implement the Traversable interface`

Can you post the code from application.config.global.php?

---

<div class="post-metadata">

**Author:** ![Tyrsson](https://yyz2.discourse-cdn.com/flex032/user_avatar/discourse.laminas.dev/tyrsson/32/1664_2.png) [@Tyrsson](https://discourse.laminas.dev/u/Tyrsson)\
**Post date:** [May 3, 2024, 7:46pm UTC](https://discourse.laminas.dev/t/issue-with-laminas-test-unit-testing/3681/6 "2024-05-03T19:46:17Z")

</div>

Where is the module/Application directory?

How did you originally set this project up? Did you start with the skeleton application?
