单元测试 WebApi POST 请求的正确方法是什么?

What is correct way for unit testing WebApi POST request?

我的所有测试 运行 都一样,除了一个测试 POST 请求。它总是 return BadRequest。我不知道到底出了什么问题,因为不知何故它没有触发以下级别(例如服务层和数据层)。
测试方法如下:

[TestMethod]
        public async Task AddTourObject()
        {
            // Упорядочение
            var mockService = new Mock<ITourObjectService>(MockBehavior.Default);
            var viewmodel = new TourObjectViewModel
            {
                TypeId = 10,
                Name = "Деревья гнулись",
                Address = "f yjxr",
                Latitude = 120.22,
                Longitude = 220.34,
                CountryId = 1,
                RegionId = 2,
                CityId = 1,
                Rating = 2,
                InternalRating = 2,
                CheckInTime = "12:00",
                CheckOutTime = "12:00",
                HowToGet = "sss",
                Web = "web",
                Email = "аааааа"
            };
            mockService.Setup(x => x.Add(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer { });
            var controller = new TourObjectController(mockService.Object);
            // Действие
            var result = await controller.Post(viewmodel);
            // Утверждение
            Assert.IsNotNull(result);
            Assert.IsInstanceOfType(result, typeof(OkNegotiatedContentResult<string>));
            Assert.IsTrue(result.ToString().Contains("успешно"));
        }

和测试方法:

public async Task<IHttpActionResult> Post(TourObjectViewModel viewmodel)
        {
            var answer = new ActionAnswer();
            try
            {
                var dto = new TourObjectDTO
                {
                    TypeId = viewmodel.TypeId,
                    Name = viewmodel.Name,
                    Address = viewmodel.Address,
                    Latitude = viewmodel.Latitude,
                    Longitude = viewmodel.Longitude,
                    CountryId = viewmodel.CountryId,
                    RegionId = viewmodel.RegionId,
                    CityId = viewmodel.CityId.Value,
                    Rating = viewmodel.Rating,
                    InternalRating = viewmodel.InternalRating,
                    CheckInTime = viewmodel.CheckInTime,
                    CheckOutTime = viewmodel.CheckOutTime,
                    HowToGet = viewmodel.HowToGet,
                    Web = viewmodel.Web,
                    Email = viewmodel.Email
                };
                answer = await _tos.Add(dto);
                return answer.IsSuccess == false ? (IHttpActionResult) BadRequest(answer.ToString()) : Ok(answer.ToString());
            }
            catch (Exception ex)
            {
                Log.ErrorFormat("Method:{0} <br/> Error: {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
                return BadRequest(answer.ToString());              
            }
        }
  1. 我是否正确设置了这个测试?
  2. 这是我应该测试的吗?

问题出在你这里的设置上。您设置的服务将为每个提供的输入 return 清空 ActionAnswer

mockService.Setup(x => x.Add(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer{})

这意味着提供给服务的只是 return 空对象。 mock 的想法是尝试在你的程序中模拟不同的行为和不同的路径。因此,您可以例如测试以下场景:

1) 如果服务 returns ActionAnswer 为 IsSuccess==false 会怎么样 mockService.Setup(x => x.Add(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer{ IsSuccess = false })

2) 如果服务 returns ActionAnswer 为 IsSuccess==true 怎么办 mockService.Setup(x => x.Add(It.IsAny<TourObjectDTO>())).ReturnsAsync(new ActionAnswer{ IsSuccess = true })

您可以选择很多路径,但想法是找到关键路径并测试它们。