Невозможно назначить void неявно типизированной переменной в модульном тесте - PullRequest
1 голос
/ 28 января 2020

каждый, я пытаюсь написать модульный тест для моего класса Processor. в моем проекте я беру файл JSON и десериализовываю его, а затем собираю и обрабатываю, а затем сохраняю в базу данных. Это мой класс процесса

public class CustomerProcessors
    {
        private static IRepository _repository;
        private static PracticeEntities4 _context;
        private static Customer customer;
        public CustomerProcessors()
        {
        }

        public CustomerProcessors(IRepository repository)
        {
            _repository = repository;
        }


        public static void Process(Customer customer)
        {
            var oldcustomer = _repository.GetOldCustomerId(customer.Code.Value);
          if (oldcustomer == null)
            {
                Save(customer);
            }
            else
                update(customer);
        }

        private static void update(Customer customer)
        {

            _repository.UpdateCustomer(customer);

        }

        private static void Save(Customer customer)
        {
            _repository.SaveCustomer(customer);
        }
    }

, это мой Builder

 public  Customer CustomerBuild(DtoCustomer dto)
        {
            return new Customer()
            {
                FirstName = dto.FirstName,
                LastName = dto.LastName,
                Address = dto.Address,
                Email = dto.Email,
                Code = int.Parse(dto.Code),
                PhoneNumber = dto.Phone

            };
        }

и, наконец, это мой модульный тест

    [TestClass]
   public class CustomerProcessorTest
    {

        private static string path;
        private static CustomerDeserializer _customerDeserializer;
        private static CustomerBuilder _customerBuilder;
        private List<Customer> _customers;
        private static Mock<IRepository> mock;
        private  Customer customer;

        [ClassInitialize]
        public static void CLassInitialize(TestContext context)
        {
            path = Path.Combine(Environment.CurrentDirectory, @"JSON\", "Customer.json");
        }

        [TestInitialize]
        public void TestInitialize()
        {
            mock = new Mock<IRepository>();
            _customerDeserializer = new CustomerDeserializer();
            _customerBuilder = new CustomerBuilder();
            _customers = new List<Customer>();
            Customer customer = new Customer();
        }

        [TestMethod]
        public void CusomerDeserialize_customerProcess()
        {
            //Arange
            mock.Setup(e => e.GetOldCustomerId(1001)).Returns(3);
            mock.Setup(e => e.GetOldStoreId(200)).Returns(3);
            //Act
            var dtos = CustomerDeserializer.Deserialize(path);
            var dto = dtos.FirstOrDefault(e => e.Code == "1001");
            var Builder= new CustomerBuilder();
            var customer = Builder.CustomerBuild(dto);
//Error here
                var process= CustomerProcessors.Process(customer);

            //Asset
            Assert.AreEqual(0, _customers.Count);
        }


    }
}

У меня есть эта ошибка, и я не знаю, что делать?

1 Ответ

1 голос
/ 28 января 2020

Измените эту строку, если код

var process= CustomerProcessors.Process(customer);

На это:

CustomerProcessors.Process(customer);

Таким образом, функция будет выполнена. Теперь вы пытаетесь присвоить void (ничто) чему-либо, чтобы компилятор жаловался.

Внесение этого изменения означает, что вы фактически не будете тестировать ничего, кроме того, что ваш код не выдает исключение.

Если вы измените строку на

// I removed the static identifier
// I added a boolean indicating success
public bool Process(Customer customer)

Тогда есть значение для проверки и подтверждения на основе условий, и вы можете повторно ввести процесс var

Редактировать для нулевой точки исключение

Ваша проблема связана с тем, что ваш репозиторий является нулевым. Чтобы решить эту проблему, внесите следующие изменения

public void Process(Customer customer)

И в ваших тестах

        [TestMethod]
        public void CusomerDeserialize_customerProcess()
        {
            //Arange
            mock.Setup(e => e.GetOldCustomerId(1001)).Returns(3);
            mock.Setup(e => e.GetOldStoreId(200)).Returns(3);
            //Act
            var dtos = CustomerDeserializer.Deserialize(path);
            var dto = dtos.FirstOrDefault(e => e.Code == "1001");
            var Builder= new CustomerBuilder();
            var customer = Builder.CustomerBuild(dto);

            // create an instance of the processor
            var processor = new CustomerProcessors(mock.Object);
            // execute the function
            processor.Process(customer);

            //Asset
            Assert.AreEqual(0, _customers.Count);
        }
...