Как использовать в транспорте памяти с поставщиком общего транспорта в MassTransit? - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь следовать этому руководству, чтобы иметь возможность создавать некоторые функциональные тесты:

https://masstransittemp.readthedocs.io/en/latest/configuration/transports/in_memory.html

Дело в том, что ни InMemoryTransportCache Класс, ни SetTransportProvider метод не может быть импортирован. Я также не могу найти их объявленных в источниках MassTransit на github. Как вы добиваетесь того, что описывает эта ссылка вверху?

Ответы [ 2 ]

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

Как уже упоминалось в комментариях - эта документация устарела, но мои вопросы остались в силе. В конце концов, я решил не go с предложенным подходом настройки контейнера Docker для брокера сообщений, но вместо этого я использовал тестовый жгут (также предложенный выше). Я использую SpecFlow, поэтому общий код заключается в создании и запуске жгута на шаге BeforeScenario, например:

[BeforeScenario]
public async Task BeforeScenario() {
    _testHarness = new InMemoryTestHarness();

    await _testHarness.Start();
    TestStartup1.SetHarness(_testHarness);
    TestStartup2.SetHarness(_testHarness);

    // build WebHost and start both asp.net TestServer instances
}

[AfterScenario]
public async Task Cleanup() {
    await _testHarness.Stop();
}

И получение экземпляра IBusControl из жгута, внутри обоих тестов стартапы:

// test startup1
public override void UseMassTransit(IServiceCollection services) {
    services.AddMassTransit(_ => {
        // configure endpoints here, etc.

        return _testHarness.BusControl;
    }, RegisterConsumers);
}

// test startup2
public override void UseMassTransit(IServiceCollection services) {
    services.AddMassTransit(_ => {
        // configure endpoints here, etc.

        _testHarness.Bus.ConnectReceiveEndpoint("your-endpoint", ep => ep.ConfigureConsumers(serviceProvider));

        return _testHarness.BusControl;
    }, RegisterConsumers);    
}

Мне еще предстоит узнать, как сделать обработку сообщений синхронной, чтобы мне не пришлось ждать результатов, но в любом случае приведенный выше код решает мою проблему.

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

Как уже упоминалось в комментариях, документы, которые вы читаете, не имеют никакого отношения к делу.

Вот как вы можете протестировать свое приложение с помощью тестовых наборов: https://masstransit-project.com/usage/testing.html

По сути, нет необходимости раскручивать тестовый сервер, если только вы не хотите проверить свои регистрации. Это довольно тяжелая работа для всех ваших тестов.

Документы предоставляют краткий пример для тестирования потребителя, поэтому я просто скопирую его сюда:

public async Task Should_test_the_consumer()
{
    var harness = new InMemoryTestHarness();
    var consumerHarness = harness.Consumer<MyConsumer>();

    await harness.Start();
    try
    {
        await harness.InputQueueSendEndpoint.Send(new MyMessage());

        // did the endpoint consume the message
        Assert.IsTrue(harness.Consumed.Select<MyMessage>().Any());

        // did the actual consumer consume the message
        Assert.IsTrue(consumerHarness.Consumed.Select<MyMessage>().Any());
    }
    finally
    {
        await harness.Stop();
    }
}

Тест Проект для тестовых комплектов также имеет кучу хороших примеров: https://github.com/MassTransit/MassTransit/tree/develop/src/MassTransit.Tests/Testing

...