コード例 #1
0
        public async Task Three_events_send_as_two_messages()
        {
            //Настройка IOC контейнера
            var services = new ServiceCollection();
            var config   = new ConfigurationBuilder().AddJsonFile("testProject.json").Build();
            var startup  = new Startup(config);

            startup.ConfigNotificationProcessor(services);

            services.AddSingleton <INotificationSender, SenderMock>(sprovider => new SenderMock(2));

            var serviceProvider = services.AddEntityFrameworkInMemoryDatabase().BuildServiceProvider();


            //In memory dbcontext
            services.AddDbContext <ESHContext>(options =>
            {
                options.UseInMemoryDatabase("InMemoryDbForTesting");
                options.UseInternalServiceProvider(serviceProvider);
            });
            services.AddScoped <IESHRepository, ESHRepository.EF.ESHRepository>();

            var sp = services.BuildServiceProvider();

            //получаем наш синглтон сендера
            var senderMock = (SenderMock)sp.GetService <INotificationSender>();

            //моделируем работу с поставками
            using (var scope = sp.CreateScope())
            {
                var repository  = scope.ServiceProvider.GetRequiredService <IESHRepository>();
                var notificator = scope.ServiceProvider.GetRequiredService <ConcurrentDictNotificator <SupplyOperation> >();
                DeliveryController deliveryController = new DeliveryController(repository, notificator);
                await deliveryController.Create(new ESHRepository.Model.Supply()
                {
                    Id    = "1",
                    Count = 1
                });

                await deliveryController.Create(new ESHRepository.Model.Supply()
                {
                    Id    = "2",
                    Count = 1
                });
            }
            using (var scope = sp.CreateScope())
            {
                var repository  = scope.ServiceProvider.GetRequiredService <IESHRepository>();
                var notificator = scope.ServiceProvider.GetRequiredService <ConcurrentDictNotificator <SupplyOperation> >();
                DeliveryController deliveryController = new DeliveryController(repository, notificator);
                await deliveryController.Update(new ESHRepository.Model.Supply()
                {
                    Id    = "2",
                    Count = 1
                });

                //ждем получения сообщений
                var messages = await senderMock.GetMessagesAsync().WithTimeout(10000);

                Assert.Equal(2, messages.Count());
                Assert.True(messages.FirstOrDefault(m => m.Title.Contains("Информация по записи 2") && m.Body.Contains("Запись создана и обновлена")) != null);
                Assert.True(messages.FirstOrDefault(m => m.Title.Contains("Информация по записи 1") && m.Body.Contains("Запись создана")) != null);
            }
        }