Merhaba arkadaşlar yakın zamanda karşılaştığım ve Asp.Net Core da gerçek database ile test yaparken karşıma çıkan sorundan bahsedicem bu gün sizlere.
Message: System.PlatformNotSupportedException : This platform does not support distributed transactions..Asp.Net Core’da EF’de distributed transactions desteği bulunmuyor.Bu yüzden başka çözümler üretmek zorundasınız.

        private readonly AccountService _accountService;
        private readonly Mock<ILogger<AccountService>> _logger;
        private readonly RedisCache _distributedCache;
        private Mock<ICurrencyRepository> _currencyRepository;
        private Queue<Task<Currency>> _queue = new Queue<Task<Currency>>();
        //Constructor
        public DepositTransactionTests()
        {
            _currencyRepository = new Mock<ICurrencyRepository>();
            _logger = new Mock<ILogger<AccountService>>();
            _distributedCache = new RedisCache(redisCacheOptions);
            _accountService = new AccountService(new AccountRepository(), _currencyRepository.Object, _logger.Object, _distributedCache);
        }

Yukarıda görmüş olduğunuz Test sınıfımızın constructor metodudur.

  
        public async Task TestMetodu()
        {
          using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
          {
             var account = DataProvider.GetAccountEURCurrency();
             //Account Servisimizin içinde Currency Repositorisi 2 kere çağırılıyor ve her çağırdığında sırasıyla 2 farklı datanın gelmesi için queue yapısından yararlandım
             _queue.Enqueue(DataProvider.GetCurrencyTLAsync());//Account Money
             _queue.Enqueue(DataProvider.GetCurrencyEURAsync());//Deposit Money

            //Burada Currency Repositorimizin Mock Data ile döndürmesi gerektiği değeri set editoruz.
            //Her çağarıldığında farklı data döndürmesi için GerORderedCurrency fonksiyonunu kullandım
             _currencyRepository
                    .Setup(x => x.Get(It.IsAny<Expression<Func<Currency, bool>>>()))
                    .Returns(GetOrderedCurrency);

            var accountTransaction = await _accountService.DepositAsync(depositModel);
            Assert.Equal(account.Balance, accountTransaction.Balance);
          }
        }
        private async Task<Currency> GetOrderedCurrency()
        {
            return await _queue.Dequeue();
        }

Buradaki sorunumuz şu.Account servisimizi mock dataya almadan normal bir şekilde çalıştırdığımızda. Servisimizin içinde 2 tane database bağlantısı olan repository sınıfımız olduğundan.

Message: System.PlatformNotSupportedException : This platform does not support distributed transactions.” Hatasıyla karşılayoruz. Repositorimizin Currency isimli olanını mock data olarak döndürerek bu sorunu çözdüm.Eğer Asp.Net Core’da birden fazla database bağlantısı yapmak isterseniz TransactionScope kullanamıyorsunuz.

Bu sorunu gidermek için servisimizin içersinde kullandığımız repositorinin birini mock data olarak eklemeniz gerekiyor. Ayrıca TransactionScope içerisinde asenkron bir yapı kullanıyorsanız constructorına “TransactionScopeAsyncFlowOption.Enabled” parametresini eklemelisiniz.

Cevap Ver

Lütfen yorumunuzu yazınız!
Lütfen isminizi buraya giriniz