简体   繁体   English

起订量返回 null 和 BadRequestObjectResult

[英]Moq returns null and BadRequestObjectResult

I'm new to unit testing, and trying to mock postContinent .我是单元测试的新手,并试图模拟postContinent But gives null and BadRequestObjectResult .但是给出nullBadRequestObjectResult

ContinentControllerTests.cs ContinentControllerTests.cs

 public class ContinentControllerTests {
 // RepoMocks
 private readonly Mock<IContinentRepository> _continentRepoMock = new Mock<IContinentRepository>();
 private readonly Mock<ICountryRepository> _countryRepoMock = new Mock<ICountryRepository>();
 private readonly Mock<ICityRepository> _cityRepoMock = new Mock<ICityRepository>();

 // Controller
 private readonly ContinentController _continentController;

     public ContinentControllerTests() {
     _continentServiceMock = new ContinentService(_continentRepoMock.Object);
     _continentController = new ContinentController(new ContinentService(_continentRepoMock.Object), new CountryService(_countryRepoMock.Object), new CityService(_cityRepoMock.Object));
     }
     [Fact]
     public void PostContinent_ValidInput_ReturnsCreateAtAction() {
     // Arrange
     _continentRepoMock
        .Setup(repo => repo.HeeftContinent("Test"))
        .Returns(false);
    _continentRepoMock
       .Setup(repo => repo.BestaatContinent(new Continent("Test", new List<Country>())))
       .Returns(false);
     _continentRepoMock
       .Setup(repo => repo.VoegContinentToe(new Continent("Test", new List<Country>())))
       .Returns(new Continent(1, "Test", new List<Country>()));
     // Act
     var response = _continentController.PostContinent(new ContinentInputDTO { Name = "Test" });

     // Assert
     Assert.IsType<CreatedAtActionResult>(response.Result);
     }
 }

ContinentController.cs大陆控制器.cs

 public class ContinentController : ControllerBase {
     private string _hostURL = $"http://localhost:5000/api/continent";
     private string _riverURL = $"http://localhost:5000/api/river";

     private ContinentService _continentService;
     private CountryService _countryService;
     private CityService _cityService;

     public ContinentController(ContinentService continentService, CountryService countryService, CityService cityService) {
         _continentService = continentService;
         _countryService = countryService;
         _cityService = cityService;
     }

     [HttpPost]
     public ActionResult<ContinentOutputDTO> PostContinent([FromBody] ContinentInputDTO continentDto) {
         try {
             if (_continentService.HeeftContinent(continentDto.Name)) { return BadRequest("Continent naam moet unique zijn!"); }
             var mappedContinent = MapToDomain.MapToContinentDomain(continentDto);
             Continent continent = _continentService.VoegContinentToe(mappedContinent);
             return CreatedAtAction(nameof(GetContinent), new { continentId = continent.Id },
             MapFromDomain.MapFromContinentDomain(_hostURL, continent));
         }
         catch (Exception ex) { return BadRequest(ex.Message); }
     }
 }

ContinentService.cs大陆服务.cs

public class ContinentService {
     private readonly IContinentRepository _repo;
     public ContinentService(IContinentRepository repo) { _repo = repo;}

      public Continent VoegContinentToe(Continent c) {
         if (c == null) throw new ContinentServiceException("VoegContinentToe : continent is null");
         if (_repo.BestaatContinent(c)) throw new ContinentServiceException("VoegContinentToe : continent bestaat reeds");
         try {return _repo.VoegContinentToe(c);}
         catch (Exception ex) { throw new ContinentServiceException("VoegContinentToe: ", ex);}
    }
}

Error: Message: Assert.IsType() Failure Expected: Microsoft.AspNetCore.Mvc.CreatedAtActionResult Actual: Microsoft.AspNetCore.Mvc.BadRequestObjectResult错误: Message: Assert.IsType() Failure Expected: Microsoft.AspNetCore.Mvc.CreatedAtActionResult Actual: Microsoft.AspNetCore.Mvc.BadRequestObjectResult

The problem is in your Setup function.问题出在您的Setup function 中。 Reference types are equal only if you have overridden the equals function or if the are the exact same reference.仅当您覆盖了等于 function 或者它们是完全相同的引用时,引用类型才相等。

So by setting it up with the new keyword, it will never match the execution time object.因此,通过使用 new 关键字设置它,它永远不会匹配执行时间 object。

Try the It.IsAny<T> function from MOQ to verify.尝试最小起订量的It.IsAny<T> function 进行验证。

Check the example here: https://documentation.help/Moq/3CF54A74.htm在此处查看示例: https://documentation.help/Moq/3CF54A74.htm

// Throws an exception for a call to Remove with any string value.
mock.Setup(x => x.Remove(It.IsAny<string>())).Throws(new InvalidOperationException());

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM