Что я могу сделать, чтобы предотвратить вызов метода при создании модульного теста? - PullRequest
0 голосов
/ 19 марта 2020

Хочу подчеркнуть, что я довольно новичок в создании модульного теста, но я искал повсюду в Google и документации, но не могу найти решение или альтернативу. Поэтому в настоящее время я пытаюсь создать модульный тест для микросервиса, над которым работает мой товарищ по команде. Конструктор класса имеет следующую структуру:

 public Constructor(IOptions<AMQ_Config> amqConfig, IConfiguration configuration)
        {
            this.amqConfig = amqConfig.Value;
            this.amqConfig.UserName = configuration["AMQ:UserName"];
            this.amqConfig.Password = configuration["AMQ:Password"];
            //this.errorTypeConfig = errorTypeConfig.Value;
            this.configuration = configuration;
            AMQSubscriber();
        }

Когда я создаю новый экземпляр конструктора в модульном тесте, он всегда будет вызывать и повторять метод AMQSubscriber();. Наивно я только что создал дубликат конструктора, который исключает метод и добавляет еще один параметр:

public UnitTestConstructor(IOptions<AMQ_Config> amqConfig, IConfiguration configuration, IConnection connection)
        {
            this.amqConfig = amqConfig.Value;
            this.amqConfig.UserName = configuration["AMQ:UserName"];
            this.amqConfig.Password = configuration["AMQ:Password"];
            //this.errorTypeConfig = errorTypeConfig.Value;
            this.configuration = configuration;
            this.connection = connection;
        }

, но это было сделано только для целей модульного тестирования. Я читал о том, как это не очень хорошая идея, потому что это противоречит цели модульного тестирования, но я не могу думать, как это изолировать, поскольку большинство методов требуют или зависят от параметров: IOptions<AMQ_Config> amqConfig, IConfiguration configuration и нашего Микросервис предназначен для Apache NMS AMQ для отправки, обработки и получения сообщений.

1 Ответ

1 голос
/ 19 марта 2020

У вас есть несколько вариантов:

1. Переместите AMQSubscriber() в другой интерфейс

Таким образом, ваш конструктор будет выглядеть так:

public Constructor(IOptions<AMQ_Config> amqConfig, IConfiguration configuration, IAMQSubscriber subscriber)
{
    // Other code ...
    subscriber.AMQSubscriber();
}

В своем модульном тесте вы можете либо смоделировать IAMQSubscriber, используя библиотеку насмешек, либо вы может обеспечить пустую реализацию:

class VoidAMQSubscriberForUnitTest : IAMQSubscriber
{
    public void AMQSubscriber()
    { 
        // Do nothing.
    }
}

Например:

// Real
new YourClass(... , new RealAMQSubscriber());
// Unit test
new YourClass(... , new VoidAMQSubscriberForUnitTest()); 

2. Сделайте методы internal constructor или stati c:

В этом случае эти типы могут видеть только типы в одной сборке и сборке модульного тестирования. т. е. прекратить тестирование указанных c методов, видимых публично.

class YourClass
{
    // Only consumed by unit test
    internal YourClass(IOptions<AMQ_Config> amqConfig, IConfiguration configuration, IConnection connection) 
    { }

    // Only consumed by unit test
    internal static YourClass CreateForUnitTest() { }
}

Возможно, вам потребуется добавить InternalsVisibleToAttribute в вашу сборку.

...