0

This is the repository class

using System;
using System.Collections.Generic;
using Dealer.Rails.Common.Utils;
using Dealer.Rails.Repository.Entities.C3;
using Dealer.Rails.Repository.Repositories.C3.Interfaces;
using Dealer.Rails.Repository.Repositories.Soar;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace Dealer.Rails.Repository.Repositories.C3
{
    public class VehicleStagingRepository : BaseRepository, IVehicleStagingRepository
    {

        public VehicleStagingRepository(ILogger<VehicleStagingRepository> logger)
          : base(logger)
        {

        }

        public void SaveVehicleStaging(List<ImportStageVh> vehicleStagingRecords, C3Context c3Context)
        {
            using (var transaction = c3Context.Database.BeginTransaction())
            {
                var vehicleStagingRecordBeforeSaving = new ImportStageVh();

                try
                {
                    foreach (var vehicleStagingRecord in vehicleStagingRecords)
                    {
                        vehicleStagingRecordBeforeSaving = vehicleStagingRecord;
                        c3Context.ImportStageVh.Add(vehicleStagingRecord);
                        c3Context.SaveChanges();
                    }
                }
                catch (TimeoutException tex)
                {
                    transaction.Rollback();
                    _logger.LogError(LoggingEvents.SaveEmployeeStaging, tex.Message);
                    throw;
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    _logger.LogError(LoggingEvents.SaveEmployeeStaging, ex, JsonConvert.SerializeObject(vehicleStagingRecordBeforeSaving));
                    throw new Exception(vehicleStagingRecordBeforeSaving.ToString(),ex);
                }

                transaction.Commit();
            }
        }


  }
}

This is the Xunit Test Cases using MOQ.

using Dealer.Rails.Repository.Entities.C3;
using Dealer.Rails.Repository.Repositories.C3;
using Dealer.Rails.Repository.Repositories.C3.Interfaces;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Moq;
using System.Collections.Generic;
using Xunit;

namespace Dealer.Rails.Repository.Tests.Repositories.Rails
{

    public class VehicleStagingRepositoryTests
    {

        [Fact]
        [Trait("Repositories", "C3")]
        public void Should_Dump_Records_To_Vehicle_Staging_Dump()
        {
            // Arrange
            var optionsBuilder = new DbContextOptionsBuilder<C3Context>();
            optionsBuilder.UseSqlServer("Data Source=dev.c3.dealertrack.corp;Initial Catalog=c3_bmc;Integrated Security=True;MultipleActiveResultSets=True;Application Name=EntityFramework");

            var mockLogger = new Mock<ILogger<VehicleStagingRepository>>();

            var mockC3Context = new C3Context(optionsBuilder.Options);
           // var vehicleStagingRecords = new List<ImportStageVh>();

            var mockRepository = new Mock<IVehicleStagingRepository>();
            mockRepository.Setup(x => x.SaveVehicleStaging(It.IsAny<List<ImportStageVh>>(), mockC3Context));

            // System under test is TemplateColumnRepository
            var sut = new VehicleStagingRepository(mockLogger.Object);

            // Act
            sut.SaveVehicleStaging(new List<ImportStageVh>(), mockC3Context);

            // Assert
            mockRepository.Verify();
            // mockRepository.Verify(m=>m.SaveVehicleStaging(vehicleStagingRecords,mockC3Context),Times.Once,"Failed to call SaveVehicleStaging method");
        }


    }
}

MOQ should allow me to independently test the repository. The issues that I am facing are

  1. In the line optionsBuilder.UseSqlServer.. If use optionsBuilder.UseSqlServer("Some dummy connection string"); The code throws an exception. It my opinion it should not.

  2. In the line mockRepository.Verify();, If use mockRepository.VerifyAll(), it fails at line

Failing during tests 3. Even the next commented line is throwing error. In my opinions it should have executed SaveStagingVehicle method atleast once.

Please guide me in resolving these issues.

Volleyball Player
  • 331
  • 1
  • 6
  • 13
  • Setups need to be `.Verifiable()` in order for `.Verify()` to work. VerifyAll also assumes that all the mockable members have been setup. Also method under test it tightly coupled to implementation concerns to me a easy to test in isolation. If you are getting database errors then this is an integration test and not a unit test. – Nkosi Apr 14 '17 at 18:04
  • related http://stackoverflow.com/questions/980554/what-is-the-purpose-of-verifiable-in-moq/1728496#1728496 – Ruben Bartelink Apr 14 '17 at 21:19

0 Answers0