在单元测试中无法将void赋值给隐式类型变量

3

大家好,我正在尝试为我的 Processor 类编写单元测试。在我的项目中,我会获取一个 JSON 文件并将其反序列化,然后构建和处理它,最后将其保存到我的数据库中。 这是我的 Process 类:

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);
        }
    }

这是我的构建器

 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);
        }


    }
}

我遇到了这个错误,但不知道该怎么办?

CustomerProcessors.Process 声明为 void。它不返回任何内容,因此没有任何可以分配给本地变量的内容,也没有类型可供 var 推断。 - madreflection
我该如何改变那个? - Nazanin
1
你期望变量 process 包含什么内容? - Sweeper
这是用于将一个客户保存或更新到数据库的程序相关内容。我已经编写了执行此操作的方法,现在我想调用它们并使用它们。 - Nazanin
我们可以看到它的作用。这很清楚。它不会返回一个值,但你却试图将不存在的返回值赋给变量。所以重复 Sweeper 的问题,“你期望变量“process”包含什么?”如果你真的期望它包含某些东西,那么 Process 需要返回它而不是 void。如果 Process 作为 void 是正常的,不要试图将其不存在的返回值分配给变量。 - madreflection
1个回答

3

如果需要更改代码,请修改此行

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)

然后根据条件进行测试和断言,可以重新引入进程变量。

编辑以解决空指针异常

您的问题源于存储库为空。要解决此问题,请进行以下更改:

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);
        }

1
如果我这样做,就会出现System.NullReferenceException: Object reference not set to an instance of an object的错误。这就是为什么我想用不同的方法来解决它。 - Nazanin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接